2023-08-09 15:44:44 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
show both comments and shifts on ticket page
diff --git a/data.lua b/data.lua index c1a4774..8d31210 100644 --- a/data.lua +++ b/data.lua @@ -248,6 +248,25 @@ function Model:del_ticket(tick_id) self.db:execute("DELETE FROM Ticket WHERE id = ?;", tick_id) end +function Model:get_shifts(ticket_id, full) + local query + if full then + query = [[ + SELECT Shift.*, User.nick AS author_nick, User.name AS author_name + FROM Shift JOIN User ON Shift.user_id = User.id + WHERE Shift.ticket_id = ? ORDER BY time ASC; + ]] + else + query = "SELECT * FROM Shift WHERE ticket_id = ? ORDER BY time ASC;" + end + local shifts = self.db:execute(query, ticket_id) + for i = 1, #shifts do + shifts[i].old_stt_name = self.states[shifts[i].old_stt_id] + shifts[i].new_stt_name = self.states[shifts[i].new_stt_id] + end + return shifts +end + function Model:add_comment(user_id, ticket_id, text) local code = self:get_next_code("Comment", "ticket_id", ticket_id) self.db:execute([[ @@ -284,6 +303,22 @@ function Model:del_comment(comm_id) self.db:execute("DELETE FROM Comment WHERE id = ?;", comm_id) end +-- return a list of events associated with a ticket sorted by time +-- currently there are two types of events: shifts and comments +function Model:get_events(ticket_id, full) + local events = {} + for _, ev in ipairs(self:get_shifts(ticket_id, full)) do + ev.type = "shift" + table.insert(events, ev) + end + for _, ev in ipairs(self:get_comments(ticket_id, full)) do + ev.type = "comment" + table.insert(events, ev) + end + table.sort(events, function (a, b) return a.time < b.time end) + return events +end + -- return a list of columns ordered by state ID -- each column is a list of cards ordered by priority -- each card is a ticket DB object with some keys added: diff --git a/skopos.lua b/skopos.lua index 25a561f..2096e4f 100644 --- a/skopos.lua +++ b/skopos.lua @@ -229,10 +229,10 @@ function App:routes() if proj == nil then return "not found", 404 end local tick = self.model:get_ticket(proj.id, tcode, true) if tick == nil then return "not found", 404 end - local comments = self.model:get_comments(tick.id, true) + local events = self.model:get_events(tick.id, true) local env = { title=self.title, user=user, proj=proj, tick=tick, - states=self.model.states, comments=comments + states=self.model.states, events=events } return lud.template.render_file("view/ticket.html", env) end}, diff --git a/view/ticket.css b/view/ticket.css index 98d6d1c..7db2378 100644 --- a/view/ticket.css +++ b/view/ticket.css @@ -14,7 +14,6 @@ display: flex; justify-content: space-between; font-size: 0.8em; - margin-bottom: 10px; } .footer-details { @@ -39,3 +38,8 @@ .comment p:last-child { margin-bottom: 0; } + +.shift { + font-size: 1.3em; + margin-top: 0px; +} diff --git a/view/ticket.html b/view/ticket.html index 30257ff..cec5956 100644 --- a/view/ticket.html +++ b/view/ticket.html @@ -34,24 +34,29 @@ </div> <div class="comments-section"> <h2>Comments</h2> - % for comm in $comments do + % for ev in $events do <div class="comment"> <div class="header-details"> - <p class="date"><strong>Date:</strong> {{os.date("%Y-%m-%d", $comm.time)}}</p> + <p class="date"><strong>Date:</strong> {{os.date("%Y-%m-%d", $ev.time)}}</p> <p class="author"> <strong>Author:</strong> - <a href="/u/{{$comm.author_nick}}">{{$comm.author_name}}</a> + <a href="/u/{{$ev.author_nick}}">{{$ev.author_name}}</a> </p> </div> - <pre>{{$comm.text}}</pre> + % if $ev.type == "comment" then + <pre>{{$ev.text}}</pre> <div class="footer-details"> <div class="menu"> - <a href="/p/{{$proj.name}}/t/{{$tick.code}}/c/{{$comm.code}}/edit">edit</a> - <form action="/p/{{$proj.name}}/t/{{$tick.code}}/c/{{$comm.code}}/del" method="post"> + <a href="/p/{{$proj.name}}/t/{{$tick.code}}/c/{{$ev.code}}/edit">edit</a> + <form action="/p/{{$proj.name}}/t/{{$tick.code}}/c/{{$ev.code}}/del" method="post"> <button type="submit">delete</button> </form> </div> </div> + % end + % if $ev.type == "shift" then + <p class="centered shift"><em>{{$ev.old_stt_name}} → {{$ev.new_stt_name}}</em></p> + % end </div> % end </div>