diff --git a/app/routes/screens.py b/app/routes/screens.py index fa0b994..da545c4 100644 --- a/app/routes/screens.py +++ b/app/routes/screens.py @@ -9,9 +9,18 @@ @screens_bp.route("/api/screens") def get_screens(): - return jsonify( - {"version": os.getenv("GIT_COMMIT", None), "screens": ["/table", "/pending"]} - ) + screens = ["/table"] + + try: + if len(app.github_service.latest_data["pending_reviews"]) > 0: + screens.append("/pending") + except: + pass + + if os.getenv("COUNT_DOWN"): + screens.append("/countdown") + + return jsonify({"version": os.getenv("GIT_COMMIT", None), "screens": screens}) @screens_bp.route("/test") @@ -57,3 +66,18 @@ def table_screen(): **app.github_service.latest_data, last_updated=app.github_service.last_updated, ) + + +@screens_bp.route("/countdown") +def countdown(): + countdown_env = os.getenv("COUNT_DOWN", "0:Unknown Event") + timestamp, event_name = countdown_env.split(":", 1) + + try: + target_time = int(timestamp) + except ValueError: + target_time = 0 # Fallback if invalid + + return render_template( + "countdown.html", target_time=target_time, event_name=event_name + ) diff --git a/app/services/github_service.py b/app/services/github_service.py index d56f415..7d109bf 100644 --- a/app/services/github_service.py +++ b/app/services/github_service.py @@ -101,6 +101,7 @@ def update_general_data(self): for label in pr.labels ], "updated_at": pr.updated_at, + "is_draft": pr.draft, } ) @@ -124,6 +125,9 @@ def update_pending_reviews(self): for pr in pull_requests: pr_details = repo.get_pull(pr.number) + if pr.draft: # Skip drafts + continue + # Check for users with pending review requests requested_reviewers = pr_details.get_review_requests() for reviewer in requested_reviewers[ @@ -134,7 +138,7 @@ def update_pending_reviews(self): { "pr_number": pr.number, "repo_name": repo.name, - "is_review": True, + "is_review": True, # This is a review request } ) @@ -150,12 +154,23 @@ def update_pending_reviews(self): { "pr_number": pr.number, "repo_name": repo.name, - "is_review": False, + "is_review": False, # Regular assignment } ) + # Sort each reviewer's assignments: review-pending first + for reviewer in pending_reviews: + pending_reviews[reviewer] = sorted( + pending_reviews[reviewer], key=lambda x: not x["is_review"] + ) + + # Sort reviewers by the number of assignments (most important at top) + sorted_reviewers = sorted( + pending_reviews.items(), key=lambda x: len(x[1]), reverse=True + ) + # Update pending reviews in the global data self.latest_data["pending_reviews"] = [ {"name": name, "assignments": assignments} - for name, assignments in pending_reviews.items() + for name, assignments in sorted_reviewers ] diff --git a/app/static/scripts/countdown.js b/app/static/scripts/countdown.js new file mode 100644 index 0000000..4147357 --- /dev/null +++ b/app/static/scripts/countdown.js @@ -0,0 +1,31 @@ +document.addEventListener("DOMContentLoaded", () => { + const countdownElement = document.getElementById("countdown"); + const targetTime = parseInt(countdownElement.dataset.targetTime) * 1000; // Convert to milliseconds + + function updateCountdown() { + const now = Date.now(); + let timeLeft = targetTime - now; + + if (timeLeft < 0) { + countdownElement.innerText = "000:00:00:00.00"; + return; + } + + let days = Math.floor(timeLeft / (1000 * 60 * 60 * 24)); + let hours = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + let minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60)); + let seconds = Math.floor((timeLeft % (1000 * 60)) / 1000); + let tenths = Math.floor((timeLeft % 1000) / 10); // Extract tenths & hundredths + + let countdownString = `${days.toString().padStart(3, '0')}:` + + `${hours.toString().padStart(2, '0')}:` + + `${minutes.toString().padStart(2, '0')}:` + + `${seconds.toString().padStart(2, '0')}.` + + `${tenths.toString().padStart(2, '0')}`; // Show two-digit tenths & hundredths + + countdownElement.innerText = countdownString; + } + + setInterval(updateCountdown, 10); // Update every 10ms + updateCountdown(); +}); diff --git a/app/static/styles/countdown.css b/app/static/styles/countdown.css new file mode 100644 index 0000000..9720577 --- /dev/null +++ b/app/static/styles/countdown.css @@ -0,0 +1,35 @@ +body { + font-family: "Courier New", Courier, monospace; + background: rgb(40, 40, 40); + color: white; + text-align: center; +} + +.countdown-container { + margin-top: 8vh; +} + +h1 { + font-size: 12em; + color: rgb(163, 0, 46); + text-shadow: 2px 2px 5px red; +} + +#countdown { + font-size: 7em; + font-weight: bold; + letter-spacing: 5px; + background: rgb(40, 40, 40); + color: rgb(163, 0, 46); + padding: 20px; + border-radius: 10px; + display: flex; /* Use flexbox for centering */ + justify-content: center; /* Center text horizontally */ + align-items: center; /* Center text vertically */ + text-align: center; + text-shadow: 2px 2px 10px red; + width: 100vw; /* Full viewport width */ + height: auto; /* Auto height */ + box-sizing: border-box; /* Include padding in width calculation */ + overflow: hidden; /* Prevent any text overflow */ +} diff --git a/app/static/styles/table.css b/app/static/styles/table.css index cd513a9..e1e4383 100644 --- a/app/static/styles/table.css +++ b/app/static/styles/table.css @@ -304,6 +304,12 @@ body { white-space: nowrap; /* Prevent text wrapping */ } +/* Draft PR Styling */ +.draft-pr { + opacity: 0.5; + background: #444 !important; +} + /* ========================= */ /* Responsive Tweaks */ /* ========================= */ diff --git a/app/templates/countdown.html b/app/templates/countdown.html new file mode 100644 index 0000000..8886fef --- /dev/null +++ b/app/templates/countdown.html @@ -0,0 +1,19 @@ + + + +
+ +