1
+ import { computed } from "@ember/object" ;
1
2
import discourseComputed from "discourse/lib/decorators" ;
2
3
import { withSilencedDeprecations } from "discourse/lib/deprecated" ;
3
- import { iconNode } from "discourse/lib/icon-library" ;
4
+ import { iconHTML , iconNode } from "discourse/lib/icon-library" ;
4
5
import { withPluginApi } from "discourse/lib/plugin-api" ;
6
+ import { formatUsername } from "discourse/lib/utilities" ;
7
+ import Topic from "discourse/models/topic" ;
8
+ import User from "discourse/models/user" ;
9
+ import PostCooked from "discourse/widgets/post-cooked" ;
5
10
import { i18n } from "discourse-i18n" ;
6
11
import SolvedAcceptAnswerButton , {
7
12
acceptAnswer ,
8
13
} from "../components/solved-accept-answer-button" ;
9
- import SolvedPost from "../components/solved-post" ;
10
14
import SolvedUnacceptAnswerButton , {
11
15
unacceptAnswer ,
12
16
} from "../components/solved-unaccept-answer-button" ;
@@ -25,10 +29,39 @@ function initializeWithApi(api) {
25
29
api . addDiscoveryQueryParam ( "solved" , { replace : true , refreshModel : true } ) ;
26
30
}
27
31
28
- api . renderBeforeWrapperOutlet ( "post-menu" , SolvedPost ) ;
32
+ api . decorateWidget ( "post-contents:after-cooked" , ( dec ) => {
33
+ if ( dec . attrs . post_number === 1 ) {
34
+ const postModel = dec . getModel ( ) ;
35
+ if ( postModel ) {
36
+ const topic = postModel . topic ;
37
+ if ( topic . accepted_answer ) {
38
+ const hasExcerpt = ! ! topic . accepted_answer . excerpt ;
39
+ const excerpt = hasExcerpt
40
+ ? ` <blockquote> ${ topic . accepted_answer . excerpt } </blockquote> `
41
+ : "" ;
42
+ const solvedQuote = `
43
+ <aside class='quote accepted-answer' data-post="${ topic . get ( "accepted_answer" ) . post_number } " data-topic="${ topic . id } ">
44
+ <div class='title ${ hasExcerpt ? "" : "title-only" } '>
45
+ <div class="accepted-answer--solver">
46
+ ${ topic . solvedByHtml }
47
+ <\/div>
48
+ <div class="accepted-answer--accepter">
49
+ ${ topic . accepterHtml }
50
+ <\/div>
51
+ <div class="quote-controls"><\/div>
52
+ </div>
53
+ ${ excerpt }
54
+ </aside>` ;
55
+
56
+ const cooked = new PostCooked ( { cooked : solvedQuote } , dec ) ;
57
+ return dec . rawHtml ( cooked . init ( ) ) ;
58
+ }
59
+ }
60
+ }
61
+ } ) ;
29
62
30
63
api . attachWidgetAction ( "post" , "acceptAnswer" , function ( ) {
31
- acceptAnswer ( this . model , this . appEvents ) ;
64
+ acceptAnswer ( this . model , this . appEvents , this . currentUser ) ;
32
65
} ) ;
33
66
34
67
api . attachWidgetAction ( "post" , "unacceptAnswer" , function ( ) {
@@ -132,6 +165,45 @@ function customizeWidgetPostMenu(api) {
132
165
export default {
133
166
name : "extend-for-solved-button" ,
134
167
initialize ( ) {
168
+ Topic . reopen ( {
169
+ // keeping this here cause there is complex localization
170
+ solvedByHtml : computed ( "accepted_answer" , "id" , function ( ) {
171
+ const username = this . get ( "accepted_answer.username" ) ;
172
+ const name = this . get ( "accepted_answer.name" ) ;
173
+ const postNumber = this . get ( "accepted_answer.post_number" ) ;
174
+
175
+ if ( ! username || ! postNumber ) {
176
+ return "" ;
177
+ }
178
+
179
+ const displayedUser =
180
+ this . siteSettings . display_name_on_posts && name
181
+ ? name
182
+ : formatUsername ( username ) ;
183
+
184
+ return i18n ( "solved.accepted_html" , {
185
+ icon : iconHTML ( "square-check" , { class : "accepted" } ) ,
186
+ username_lower : username . toLowerCase ( ) ,
187
+ username : displayedUser ,
188
+ post_path : `${ this . url } /${ postNumber } ` ,
189
+ post_number : postNumber ,
190
+ user_path : User . create ( { username } ) . path ,
191
+ } ) ;
192
+ } ) ,
193
+ accepterHtml : computed ( "accepted_answer" , function ( ) {
194
+ const username = this . get ( "accepted_answer.accepter_username" ) ;
195
+ const name = this . get ( "accepted_answer.accepter_name" ) ;
196
+ const formattedUsername =
197
+ this . siteSettings . display_name_on_posts && name
198
+ ? name
199
+ : formatUsername ( username ) ;
200
+ return i18n ( "solved.marked_solved_by" , {
201
+ username : formattedUsername ,
202
+ username_lower : username . toLowerCase ( ) ,
203
+ } ) ;
204
+ } ) ,
205
+ } ) ;
206
+
135
207
withPluginApi ( "2.0.0" , ( api ) => {
136
208
withSilencedDeprecations ( "discourse.hbr-topic-list-overrides" , ( ) => {
137
209
let topicStatusIcons ;
0 commit comments