Skip to content
This repository was archived by the owner on Jul 14, 2025. It is now read-only.

Commit 32b3210

Browse files
completed logic and added tests for existing code and implemented code
1 parent 4b1671e commit 32b3210

File tree

6 files changed

+258
-17
lines changed

6 files changed

+258
-17
lines changed

assets/javascripts/discourse/components/topic-level-assign-menu.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,6 @@ function avatarHtml(user, size, classes) {
105105
});
106106
}
107107

108-
// function nameOrUsername() {
109-
// if (this.siteSettings.prioritize_full_name_in_ux) {
110-
// topic.assigned_to_user?.name || topic.assigned_to_user?.username;
111-
// } else {
112-
// topic.assigned_to_user?.username;
113-
// }
114-
// }
115-
116108
function extractPostId(buttonId) {
117109
// buttonId format is "unassign-from-post-${postId}"
118110
const start = buttonId.lastIndexOf("-") + 1;

assets/javascripts/discourse/initializers/extend-for-assigns.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,13 @@ function initialize(api) {
478478
assignedPath = `/t/${topic.id}`;
479479
}
480480
const icon = iconHTML(assignee.username ? "user-plus" : "group-plus");
481-
const name = assignee.username || assignee.name;
481+
let name;
482+
if (siteSettings.prioritize_full_name_in_ux) {
483+
name = assignee.name;
484+
} else {
485+
name = assignee.username;
486+
}
487+
482488
const tagName = params.tagName || "a";
483489
const href =
484490
tagName === "a"
@@ -528,14 +534,19 @@ function initialize(api) {
528534
})
529535
)}</span>`;
530536
};
531-
537+
let displayedName = "";
532538
if (assignedToUser) {
539+
if (this.siteSettings.prioritize_full_name_in_ux) {
540+
displayedName = assignedToUser.name;
541+
} else {
542+
displayedName = assignedToUser.username;
543+
}
533544
assigneeElements.push(
534545
h(
535546
"span.assignee",
536547
new RawHtml({
537548
html: assignedHtml(
538-
assignedToUser.username,
549+
displayedName,
539550
assignedToUserPath(assignedToUser),
540551
"user"
541552
),
@@ -557,10 +568,18 @@ function initialize(api) {
557568
)
558569
);
559570
}
571+
560572
if (indirectlyAssignedTo) {
561573
Object.keys(indirectlyAssignedTo).map((postId) => {
562574
const assignee = indirectlyAssignedTo[postId].assigned_to;
563575
const postNumber = indirectlyAssignedTo[postId].post_number;
576+
577+
if (this.siteSettings.prioritize_full_name_in_ux) {
578+
displayedName = assignee.name;
579+
} else {
580+
displayedName = assignee.username;
581+
}
582+
564583
assigneeElements.push(
565584
h("span.assignee", [
566585
h(
@@ -573,14 +592,14 @@ function initialize(api) {
573592
},
574593
i18n("discourse_assign.assign_post_to_multiple", {
575594
post_number: postNumber,
576-
username: assignee.username || assignee.name,
595+
username: displayedName,
577596
})
578597
),
579598
])
580599
);
581600
});
582601
}
583-
console.log(assigneeElements);
602+
584603
if (!isEmpty(assigneeElements)) {
585604
return h("p.assigned-to", [
586605
assignedToUser ? iconNode("user-plus") : iconNode("group-plus"),

assets/javascripts/discourse/models/assignment.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export class Assignment extends EmberObject {
66
const assignment = new Assignment();
77
assignment.id = 0;
88
assignment.username = topic.assigned_to_user?.username;
9-
assignment.name = topic.assigned_to_user?.name;
109
assignment.groupName = topic.assigned_to_group?.name;
1110
assignment.status = topic.assignment_status;
1211
assignment.note = topic.assignment_note;

spec/system/assign_post_spec.rb

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
# frozen_string_literal: true
2+
3+
describe "Assign | Assigning posts", type: :system do
4+
let(:topic_page) { PageObjects::Pages::Topic.new }
5+
let(:assign_modal) { PageObjects::Modals::Assign.new }
6+
fab!(:staff_user) { Fabricate(:user, groups: [Group[:staff]]) }
7+
fab!(:admin)
8+
fab!(:topic)
9+
fab!(:post1) { Fabricate(:post, topic: topic) }
10+
fab!(:post2) { Fabricate(:post, topic: topic) }
11+
12+
before do
13+
SiteSetting.assign_enabled = true
14+
15+
# # The system tests in this file are flaky and auth token related so turning this on
16+
# SiteSetting.verbose_auth_token_logging = true
17+
18+
sign_in(admin)
19+
end
20+
21+
describe "with open topic" do
22+
before { SiteSetting.prioritize_full_name_in_ux = false }
23+
24+
it "can assign and unassign" do
25+
visit "/t/#{topic.id}"
26+
27+
topic_page.click_assign_post(post2)
28+
assign_modal.assignee = staff_user
29+
assign_modal.confirm
30+
31+
expect(assign_modal).to be_closed
32+
33+
expect(topic_page).to have_assigned_post(user: staff_user, at_post: 3)
34+
35+
expect(topic_page.find_post_assign(post1.post_number)).to have_content(staff_user.username)
36+
expect(topic_page.find_post_assign(post2.post_number)).to have_content(staff_user.username)
37+
38+
visit "/t/#{topic.id}"
39+
40+
topic_page.click_unassign_post(post2)
41+
42+
expect(topic_page).to have_unassigned_from_post(user: staff_user, at_post: 4)
43+
expect(page).to have_no_css("#topic .assigned-to")
44+
end
45+
46+
it "can submit form with shortcut from texatea" do
47+
visit "/t/#{topic.id}"
48+
49+
topic_page.click_assign_post(post2)
50+
assign_modal.assignee = staff_user
51+
52+
find("body").send_keys(:tab)
53+
find("body").send_keys(:control, :enter)
54+
55+
expect(assign_modal).to be_closed
56+
expect(topic_page).to have_assigned_post(user: staff_user, at_post: 3)
57+
expect(topic_page.find_post_assign(post1.post_number)).to have_content(staff_user.username)
58+
expect(topic_page.find_post_assign(post2.post_number)).to have_content(staff_user.username)
59+
end
60+
61+
context "when prioritize_full_name_in_ux setting is enabled" do
62+
before { SiteSetting.prioritize_full_name_in_ux = true }
63+
64+
it "shows the user's name after assign" do
65+
visit "/t/#{topic.id}"
66+
67+
topic_page.click_assign_post(post2)
68+
assign_modal.assignee = staff_user
69+
assign_modal.confirm
70+
expect(topic_page.find_post_assign(post1.post_number)).to have_content(staff_user.name)
71+
expect(topic_page.find_post_assign(post2.post_number)).to have_content(staff_user.name)
72+
end
73+
end
74+
75+
context "when assigns are not public" do
76+
before { SiteSetting.assigns_public = false }
77+
78+
it "assigned small action post has 'private-assign' in class attribute" do
79+
visit "/t/#{topic.id}"
80+
81+
topic_page.click_assign_post(post2)
82+
assign_modal.assignee = staff_user
83+
assign_modal.confirm
84+
85+
expect(assign_modal).to be_closed
86+
expect(topic_page).to have_assigned_post(
87+
user: staff_user,
88+
at_post: 3,
89+
class_attribute: ".private-assign",
90+
)
91+
end
92+
end
93+
94+
context "when unassign_on_close is set to true" do
95+
before { SiteSetting.unassign_on_close = true }
96+
97+
it "unassigns the topic on close" do
98+
visit "/t/#{topic.id}"
99+
100+
topic_page.click_assign_post(post2)
101+
assign_modal.assignee = staff_user
102+
assign_modal.confirm
103+
104+
expect(assign_modal).to be_closed
105+
expect(topic_page).to have_assigned_post(user: staff_user, at_post: 3)
106+
107+
find(".timeline-controls .toggle-admin-menu").click
108+
find(".topic-admin-close").click
109+
110+
expect(find("#post_4")).to have_content(
111+
I18n.t("js.action_codes.closed.enabled", when: "just now"),
112+
)
113+
expect(page).to have_no_css("#post_5")
114+
expect(page).to have_no_css("#topic .assigned-to")
115+
end
116+
117+
it "can assign the previous assignee" do
118+
visit "/t/#{topic.id}"
119+
120+
topic_page.click_assign_post(post2)
121+
assign_modal.assignee = staff_user
122+
assign_modal.confirm
123+
124+
expect(assign_modal).to be_closed
125+
expect(topic_page).to have_assigned_post(user: staff_user, at_post: 3)
126+
127+
find(".timeline-controls .toggle-admin-menu").click
128+
find(".topic-admin-close").click
129+
130+
expect(find("#post_4")).to have_content(
131+
I18n.t("js.action_codes.closed.enabled", when: "just now"),
132+
)
133+
expect(page).to have_no_css("#post_5")
134+
expect(page).to have_no_css("#topic .assigned-to")
135+
136+
topic_page.click_assign_post(post2)
137+
assign_modal.assignee = staff_user
138+
assign_modal.confirm
139+
140+
expect(page).to have_no_css("#post_5")
141+
expect(topic_page.find_post_assign(post1.post_number)).to have_content(staff_user.username)
142+
expect(topic_page.find_post_assign(post2.post_number)).to have_content(staff_user.username)
143+
end
144+
145+
context "when reassign_on_open is set to true" do
146+
before { SiteSetting.reassign_on_open = true }
147+
148+
it "reassigns the topic on open" do
149+
visit "/t/#{topic.id}"
150+
151+
topic_page.click_assign_post(post2)
152+
assign_modal.assignee = staff_user
153+
assign_modal.confirm
154+
155+
expect(assign_modal).to be_closed
156+
expect(topic_page).to have_assigned_post(user: staff_user, at_post: 3)
157+
158+
find(".timeline-controls .toggle-admin-menu").click
159+
find(".topic-admin-close").click
160+
161+
expect(find("#post_4")).to have_content(
162+
I18n.t("js.action_codes.closed.enabled", when: "just now"),
163+
)
164+
expect(page).to have_no_css("#post_5")
165+
expect(page).to have_no_css("#topic .assigned-to")
166+
167+
find(".timeline-controls .toggle-admin-menu").click
168+
find(".topic-admin-open").click
169+
170+
expect(find("#post_5")).to have_content(
171+
I18n.t("js.action_codes.closed.disabled", when: "just now"),
172+
)
173+
expect(page).to have_no_css("#post_6")
174+
expect(topic_page.find_post_assign(post1.post_number)).to have_content(
175+
staff_user.username,
176+
)
177+
expect(topic_page.find_post_assign(post2.post_number)).to have_content(
178+
staff_user.username,
179+
)
180+
end
181+
end
182+
end
183+
end
184+
end

spec/system/assign_topic_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@
4949
expect(find("#topic .assigned-to")).to have_content(staff_user.username)
5050
end
5151

52+
context "when prioritize_full_name_in_ux setting is enabled" do
53+
before { SiteSetting.prioritize_full_name_in_ux = true }
54+
55+
it "shows the user's name after assign" do
56+
visit "/t/#{topic.id}"
57+
58+
topic_page.click_assign_topic
59+
assign_modal.assignee = staff_user
60+
assign_modal.confirm
61+
expect(find("#topic .assigned-to")).to have_content(staff_user.name)
62+
end
63+
end
64+
5265
context "when assigns are not public" do
5366
before { SiteSetting.assigns_public = false }
5467

spec/system/page_objects/pages/topic.rb

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,62 @@ def click_unassign_topic
1212
find("[data-value='unassign']").click
1313
end
1414

15+
def click_unassign_post(post)
16+
find("#topic-footer-dropdown-reassign").click
17+
data_value = "unassign-from-post-#{post.id}"
18+
find("[data-value=\"#{data_value}\"]").click
19+
end
20+
21+
def click_assign_post(post)
22+
find_post_action_button(post, :show_more).click
23+
assign_post = within_post(post) { find(".post-action-menu__assign-post") }
24+
assign_post.click
25+
end
26+
1527
def click_edit_topic_assignment
1628
find("#topic-footer-dropdown-reassign").click
1729
find("[data-value='reassign']").click
1830
end
1931

32+
def find_post_assign(post_number)
33+
within("#post_#{post_number}") { find(".assigned-to") }
34+
end
35+
2036
def has_assigned?(args)
2137
has_assignment_action?(action: "assigned", **args)
2238
end
2339

40+
def has_assigned_post?(args)
41+
has_assignment_action?(action: "assigned_to_post", **args)
42+
end
43+
2444
def has_unassigned?(args)
2545
has_assignment_action?(action: "unassigned", **args)
2646
end
2747

48+
def has_unassigned_from_post?(args)
49+
has_assignment_action?(action: "unassigned_from_post", **args)
50+
end
51+
2852
def has_assignment_action?(args)
2953
assignee = args[:group]&.name || args[:user]&.username
3054

3155
container =
3256
args[:at_post] ? find("#post_#{args[:at_post]}#{args[:class_attribute] || ""}") : page
3357

34-
container.has_content?(
35-
I18n.t("js.action_codes.#{args[:action]}", who: "@#{assignee}", when: "just now"),
36-
)
58+
post_content =
59+
I18n.t(
60+
"js.action_codes.#{args[:action]}",
61+
path: "",
62+
who: "@#{assignee}",
63+
when: "just now",
64+
)
65+
66+
if args[:action] == "assigned_to_post" || args[:action] == "unassigned_from_post"
67+
post_content.gsub!(%r{<a[^>]*>(.*?)</a>}, '\1')
68+
end
69+
70+
container.has_content?(post_content)
3771
end
3872
end
3973
end

0 commit comments

Comments
 (0)