Skip to content

Commit 7d8cfdf

Browse files
refactor(core): backport & improve extensibility of DiscussionListItem (#4048)
1 parent 845c38d commit 7d8cfdf

File tree

1 file changed

+57
-27
lines changed

1 file changed

+57
-27
lines changed

framework/core/js/src/forum/components/DiscussionListItem.tsx

Lines changed: 57 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,22 @@ export default class DiscussionListItem<CustomAttrs extends IDiscussionListItemA
6363
}
6464

6565
view() {
66-
const discussion = this.attrs.discussion;
66+
const attrs = this.elementAttrs();
67+
68+
return <div {...attrs}>{this.viewItems().toArray()}</div>;
69+
}
70+
71+
viewItems(): ItemList<Mithril.Children> {
72+
const items = new ItemList<Mithril.Children>();
6773

74+
const discussion = this.attrs.discussion;
6875
const controls = DiscussionControls.controls(discussion, this).toArray();
69-
const attrs = this.elementAttrs();
7076

71-
return (
72-
<div {...attrs}>
73-
{this.controlsView(controls)}
74-
{this.slidableUnderneathView()}
75-
{this.contentView()}
76-
</div>
77-
);
77+
items.add('controls', this.controlsView(controls), 100);
78+
items.add('slidableUnderneath', this.slidableUnderneathView(), 90);
79+
items.add('content', this.contentView(), 80);
80+
81+
return items;
7882
}
7983

8084
controlsView(controls: Mithril.ChildArray): Mithril.Children {
@@ -113,14 +117,22 @@ export default class DiscussionListItem<CustomAttrs extends IDiscussionListItemA
113117

114118
return (
115119
<div className={classList('DiscussionListItem-content', 'Slidable-content', { unread: isUnread, read: isRead })}>
116-
{this.authorAvatarView()}
117-
{this.badgesView()}
118-
{this.mainView()}
119-
{this.replyCountItem()}
120+
{this.contentItems().toArray()}
120121
</div>
121122
);
122123
}
123124

125+
contentItems(): ItemList<Mithril.Children> {
126+
const items = new ItemList<Mithril.Children>();
127+
128+
items.add('authorAvatar', this.authorAvatarView(), 100);
129+
items.add('badges', this.badgesView(), 90);
130+
items.add('main', this.mainView(), 80);
131+
items.add('replyCount', this.replyCountItem().toArray(), 70);
132+
133+
return items;
134+
}
135+
124136
authorAvatarView(): Mithril.Children {
125137
const discussion = this.attrs.discussion;
126138
const user = discussion.user();
@@ -149,12 +161,22 @@ export default class DiscussionListItem<CustomAttrs extends IDiscussionListItemA
149161

150162
return (
151163
<Link href={app.route.discussion(discussion, jumpTo)} className="DiscussionListItem-main">
152-
<h2 className="DiscussionListItem-title">{highlight(discussion.title(), this.highlightRegExp)}</h2>
153-
<ul className="DiscussionListItem-info">{listItems(this.infoItems().toArray())}</ul>
164+
{this.mainItems().toArray()}
154165
</Link>
155166
);
156167
}
157168

169+
mainItems(): ItemList<Mithril.Children> {
170+
const items = new ItemList<Mithril.Children>();
171+
172+
const discussion = this.attrs.discussion;
173+
174+
items.add('title', <h2 className="DiscussionListItem-title">{highlight(discussion.title(), this.highlightRegExp)}</h2>, 100);
175+
items.add('info', <ul className="DiscussionListItem-info">{listItems(this.infoItems().toArray())}</ul>, 90);
176+
177+
return items;
178+
}
179+
158180
getJumpTo() {
159181
const discussion = this.attrs.discussion;
160182
let jumpTo = 0;
@@ -252,30 +274,38 @@ export default class DiscussionListItem<CustomAttrs extends IDiscussionListItemA
252274
return items;
253275
}
254276

255-
replyCountItem() {
277+
replyCountItem(): ItemList<Mithril.Children> {
278+
const items = new ItemList<Mithril.Children>();
279+
256280
const discussion = this.attrs.discussion;
257281
const showUnread = !this.showRepliesCount() && discussion.isUnread();
258282

259283
if (showUnread) {
260-
return (
284+
items.add(
285+
'unreadCount',
261286
<button className="Button--ua-reset DiscussionListItem-count" onclick={this.markAsRead.bind(this)}>
262287
<span aria-hidden="true">{abbreviateNumber(discussion.unreadCount())}</span>
263288

264289
<span className="visually-hidden">
265290
{app.translator.trans('core.forum.discussion_list.unread_replies_a11y_label', { count: discussion.replyCount() })}
266291
</span>
267-
</button>
292+
</button>,
293+
100
268294
);
269-
}
295+
} else {
296+
items.add(
297+
'count',
298+
<span className="DiscussionListItem-count">
299+
<span aria-hidden="true">{abbreviateNumber(discussion.replyCount())}</span>
270300

271-
return (
272-
<span className="DiscussionListItem-count">
273-
<span aria-hidden="true">{abbreviateNumber(discussion.replyCount())}</span>
301+
<span className="visually-hidden">
302+
{app.translator.trans('core.forum.discussion_list.total_replies_a11y_label', { count: discussion.replyCount() })}
303+
</span>
304+
</span>,
305+
100
306+
);
307+
}
274308

275-
<span className="visually-hidden">
276-
{app.translator.trans('core.forum.discussion_list.total_replies_a11y_label', { count: discussion.replyCount() })}
277-
</span>
278-
</span>
279-
);
309+
return items;
280310
}
281311
}

0 commit comments

Comments
 (0)