|
7 | 7 | <link rel="stylesheet" href="https://cdn.datatables.net/rowgroup/1.5.1/css/rowGroup.dataTables.min.css" /> |
8 | 8 | <style> |
9 | 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 | | - } |
| 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 | 24 | } |
25 | 25 | main { |
26 | 26 | max-width: 100rem; |
|
51 | 51 | width: 2.5rem; |
52 | 52 | } |
53 | 53 | table.dataTable > tbody > tr > td.status { |
54 | | - position: relative; |
55 | | - overflow: hidden; |
56 | | - padding-left: 16px; |
57 | | - white-space: nowrap; |
| 54 | + position: relative; |
| 55 | + overflow: hidden; |
| 56 | + padding-left: 16px; |
| 57 | + white-space: nowrap; |
58 | 58 | } |
59 | 59 | td.status:before { |
60 | | - content: " "; |
61 | | - position: absolute; |
62 | | - display: block; |
63 | | - left: 6px; |
64 | | - width: 6px; |
65 | | - top: 0; |
66 | | - bottom: 0; |
| 60 | + content: " "; |
| 61 | + position: absolute; |
| 62 | + display: block; |
| 63 | + left: 6px; |
| 64 | + width: 6px; |
| 65 | + top: 0; |
| 66 | + bottom: 0; |
67 | 67 | } |
68 | 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; |
| 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 | 76 | } |
77 | 77 |
|
78 | 78 | #rollupModal { |
|
156 | 156 | </td> |
157 | 157 | {% let pending_build = crate::templates::get_pending_build(pr) %} |
158 | 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 %}"> |
| 159 | + {% if let Some(build) = pending_build %} |
| 160 | + data-created-at="{{ build.created_at.timestamp_millis() }}" |
| 161 | + {% endif %}> |
162 | 162 |
|
163 | 163 | {% if let Some(try_build) = pr.try_build %} |
164 | 164 | <a href="../results/{{ repo_name }}/{{ pr.number }}">{{ crate::templates::status_text(pr) }}</a> (try) |
|
423 | 423 | } |
424 | 424 |
|
425 | 425 | if (minutes > 0) { |
| 426 | + if (output.length > 0) { |
| 427 | + output += ' '; |
| 428 | + } |
426 | 429 | output += `${minutes}m`; |
427 | 430 | } |
428 | 431 | if (output.length > 0) { |
|
434 | 437 | function updateElapsedTimes() { |
435 | 438 | const now = Date.now(); |
436 | 439 | document.querySelectorAll('[data-created-at]').forEach(td => { |
437 | | - const createdAtMs = parseInt(td.getAttribute('data-created-at'), 10); |
| 440 | + const createdAtMs = parseInt(td.dataset.createdAt, 10); |
438 | 441 | if (createdAtMs > 0) { |
439 | 442 | const elapsedMs = now - createdAtMs; |
440 | 443 | const formattedTime = formatElapsedTime(elapsedMs); |
|
445 | 448 | } |
446 | 449 |
|
447 | 450 | updateElapsedTimes(); |
| 451 | + setInterval(updateElapsedTimes, 1000); |
448 | 452 | </script> |
449 | 453 | {% endblock %} |
0 commit comments