|
6 | 6 | <link rel="stylesheet" href="https://cdn.datatables.net/2.3.4/css/dataTables.dataTables.min.css" /> |
7 | 7 | <link rel="stylesheet" href="https://cdn.datatables.net/rowgroup/1.5.1/css/rowGroup.dataTables.min.css" /> |
8 | 8 | <style> |
| 9 | + @keyframes barber-pole { |
| 10 | + /* This animation is used to make the status indicator next to |
| 11 | + pending pulls look like a barber poll. We do that with a |
| 12 | + diagonal linear gradient. CSS does not allow us to animate a |
| 13 | + gradient, so instead we make the indicator a little taller |
| 14 | + than shown, and then animate the whole thing upward. */ |
| 15 | + from{ |
| 16 | + transform: translate(0, 0); |
| 17 | + } |
| 18 | + to { |
| 19 | + /* The magic number 11.314 is sqrt(8^2 + 8^2), based on how |
| 20 | + far vertically it takes to repeat a 45 degree gradient |
| 21 | + that is 8 pixels long before it repeats. */ |
| 22 | + transform: translate(0, -11.314px); |
| 23 | + } |
| 24 | + } |
9 | 25 | main { |
10 | 26 | max-width: 100rem; |
11 | 27 | width: 100%; |
|
34 | 50 | td.select-checkbox { |
35 | 51 | width: 2.5rem; |
36 | 52 | } |
| 53 | + table.dataTable > tbody > tr > td.status { |
| 54 | + position: relative; |
| 55 | + overflow: hidden; |
| 56 | + padding-left: 16px; |
| 57 | + white-space: nowrap; |
| 58 | + } |
| 59 | + td.status:before { |
| 60 | + content: " "; |
| 61 | + position: absolute; |
| 62 | + display: block; |
| 63 | + left: 6px; |
| 64 | + width: 6px; |
| 65 | + top: 0; |
| 66 | + bottom: 0; |
| 67 | + } |
| 68 | + td.status[data-status="pending"]:before { |
| 69 | + /* Give the pending state a little bit of animation to make it |
| 70 | + clear that these items are the ones that are being tested |
| 71 | + right now. */ |
| 72 | + bottom: -20px; |
| 73 | + background-color: #F0DE57; |
| 74 | + background-image: repeating-linear-gradient(135deg, #F0DE57 0, #F0DE57 4px, #FBEE97 4px, #FBEE97 8px, #F0DE57 0); |
| 75 | + animation: barber-pole 1s linear infinite; |
| 76 | + } |
37 | 77 |
|
38 | 78 | #rollupModal { |
39 | 79 | display: none; |
@@ -114,12 +154,18 @@ <h1> |
114 | 154 | <td data-pr-number="{{ pr.number.0 }}"> |
115 | 155 | <a href="{{ repo_url }}/pull/{{ pr.number }}">{{ pr.number.0 }}</a> |
116 | 156 | </td> |
117 | | - <td data-status="{{ crate::templates::status_text(pr) }}"> |
| 157 | + {% let pending_build = crate::templates::get_pending_build(pr) %} |
| 158 | + <td class="status" data-status="{{ crate::templates::status_text(pr) }}" |
| 159 | + data-created-at="{% if let Some(build) = pending_build %} |
| 160 | + {{ build.created_at.timestamp_millis() }} |
| 161 | + {% endif %}"> |
| 162 | + |
118 | 163 | {% if let Some(try_build) = pr.try_build %} |
119 | 164 | <a href="../results/{{ repo_name }}/{{ pr.number }}">{{ crate::templates::status_text(pr) }}</a> (try) |
120 | 165 | {% else %} |
121 | 166 | {{ crate::templates::status_text(pr) }} |
122 | 167 | {% endif %} |
| 168 | + <span class="elapsed-time-display"></span> |
123 | 169 | </td> |
124 | 170 | <td> |
125 | 171 | {% match pr.mergeable_state %} |
@@ -364,5 +410,28 @@ <h1> |
364 | 410 |
|
365 | 411 | window.location.href = oauthUrl.toString(); |
366 | 412 | }); |
| 413 | + |
| 414 | + function formatElapsedTime(ms) { |
| 415 | + const minutes = Math.floor(ms / 60000); |
| 416 | + if (minutes > 0) { |
| 417 | + return ` (${minutes}m)`; |
| 418 | + } |
| 419 | + return ''; |
| 420 | + } |
| 421 | + |
| 422 | + function updateElapsedTimes() { |
| 423 | + const now = Date.now(); |
| 424 | + document.querySelectorAll('[data-created-at]').forEach(td => { |
| 425 | + const createdAtMs = parseInt(td.getAttribute('data-created-at'), 10); |
| 426 | + if (createdAtMs > 0) { |
| 427 | + const elapsedMs = now - createdAtMs; |
| 428 | + const formattedTime = formatElapsedTime(elapsedMs); |
| 429 | + let display = td.querySelector('.elapsed-time-display'); |
| 430 | + display.textContent = formattedTime; |
| 431 | + } |
| 432 | + }); |
| 433 | + } |
| 434 | + |
| 435 | + updateElapsedTimes(); |
367 | 436 | </script> |
368 | 437 | {% endblock %} |
0 commit comments