75 next.comment.replace("\r", "").split('\n'), |
75 next.comment.replace("\r", "").split('\n'), |
76 cur.comment.replace("\r", "").split('\n') |
76 cur.comment.replace("\r", "").split('\n') |
77 ).joinToString("\n", transform = DiffRow::getOldLine) |
77 ).joinToString("\n", transform = DiffRow::getOldLine) |
78 ) |
78 ) |
79 |
79 |
80 private fun fullContent(issue: IssueHistoryEntry) = IssueDiff( |
80 private fun fullContent(http: HttpRequest, issue: IssueHistoryEntry) = IssueDiff( |
81 issue.issueid, |
81 issue.issueid, |
82 issue.subject, |
|
83 issue.project, |
82 issue.project, |
84 issue.component, |
83 issue.component, |
85 issue.status.name, |
84 http.i18n("issue.status."+issue.status.name), |
86 issue.category.name, |
85 http.i18n("issue.category."+issue.category.name), |
87 issue.category.name, |
|
88 issue.subject, |
86 issue.subject, |
89 issue.description.replace("\r", ""), |
87 issue.description.replace("\r", ""), |
90 issue.assignee, |
88 issue.assignee, |
91 issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "", |
89 issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "", |
92 issue.affected, |
90 issue.affected, |
93 issue.resolved |
91 issue.resolved |
94 ) |
92 ) |
95 |
93 |
96 private fun diffContent(cur: IssueHistoryEntry, next: IssueHistoryEntry): IssueDiff { |
94 private fun diffContent(http: HttpRequest, cur: IssueHistoryEntry, next: IssueHistoryEntry): IssueDiff { |
97 val prev = fullContent(next) |
95 val prev = fullContent(http, next) |
98 val diff = fullContent(cur) |
96 val diff = fullContent(http, cur) |
99 val result = diffGenerator.generateDiffRows( |
97 val result = diffGenerator.generateDiffRows( |
100 listOf( |
98 listOf( |
101 prev.subject, prev.component, prev.status, |
99 prev.subject, prev.component, prev.status, |
102 prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved |
100 prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved |
103 ), |
101 ), |
127 /** |
125 /** |
128 * Generates the feed entries. |
126 * Generates the feed entries. |
129 * Assumes that [issueEntries] and [commentEntries] are already sorted by timestamp (descending). |
127 * Assumes that [issueEntries] and [commentEntries] are already sorted by timestamp (descending). |
130 */ |
128 */ |
131 private fun generateFeedEntries( |
129 private fun generateFeedEntries( |
|
130 http: HttpRequest, |
132 issueEntries: List<IssueHistoryEntry>, |
131 issueEntries: List<IssueHistoryEntry>, |
133 commentEntries: List<IssueCommentHistoryEntry> |
132 commentEntries: List<IssueCommentHistoryEntry> |
134 ): List<IssueFeedEntry> = |
133 ): List<IssueFeedEntry> = |
135 (generateIssueFeedEntries(issueEntries) + generateCommentFeedEntries(commentEntries)).sortedByDescending { it.time } |
134 (generateIssueFeedEntries(http, issueEntries) + generateCommentFeedEntries(commentEntries)).sortedByDescending { it.time } |
136 |
135 |
137 private fun generateIssueFeedEntries(entries: List<IssueHistoryEntry>): List<IssueFeedEntry> = |
136 private fun generateIssueFeedEntries(http: HttpRequest, entries: List<IssueHistoryEntry>): List<IssueFeedEntry> = |
138 if (entries.isEmpty()) { |
137 if (entries.isEmpty()) { |
139 emptyList() |
138 emptyList() |
140 } else { |
139 } else { |
141 entries.groupBy { it.issueid }.mapValues { (_, history) -> |
140 entries.groupBy { it.issueid }.mapValues { (_, history) -> |
142 history.zipWithNext().map { (cur, next) -> |
141 history.zipWithNext().map { (cur, next) -> |
143 IssueFeedEntry( |
142 IssueFeedEntry( |
144 cur.time, cur.type, issue = diffContent(cur, next) |
143 cur.time, cur.type, issue = diffContent(http, cur, next) |
145 ) |
144 ) |
146 }.plus( |
145 }.plus( |
147 history.last().let { IssueFeedEntry(it.time, it.type, issue = fullContent(it)) } |
146 history.last().let { IssueFeedEntry(it.time, it.type, issue = fullContent(http, it)) } |
148 ) |
147 ) |
149 }.flatMap { it.value } |
148 }.flatMap { it.value } |
150 } |
149 } |
151 |
150 |
152 private fun generateCommentFeedEntries(entries: List<IssueCommentHistoryEntry>): List<IssueFeedEntry> = |
151 private fun generateCommentFeedEntries(entries: List<IssueCommentHistoryEntry>): List<IssueFeedEntry> = |
190 "all" -> commentsFromDb |
189 "all" -> commentsFromDb |
191 "new" -> commentsFromDb.filter { it.type == IssueHistoryType.NewComment } |
190 "new" -> commentsFromDb.filter { it.type == IssueHistoryType.NewComment } |
192 else -> emptyList() |
191 else -> emptyList() |
193 } |
192 } |
194 |
193 |
195 http.view = IssueFeed(project, generateFeedEntries(issueHistory, commentHistory)) |
194 http.view = IssueFeed(project, generateFeedEntries(http, issueHistory, commentHistory)) |
196 http.renderFeed("issues-feed") |
195 http.renderFeed("issues-feed") |
197 } |
196 } |
198 } |
197 } |