X-Git-Url: http://nitlanguage.org
diff --git a/contrib/nitrpg/src/templates/panels.nit b/contrib/nitrpg/src/templates/panels.nit
index ba6410e..97078ab 100644
--- a/contrib/nitrpg/src/templates/panels.nit
+++ b/contrib/nitrpg/src/templates/panels.nit
@@ -17,7 +17,8 @@
# Panels templates for `nitpg`.
module panels
-import templates_base
+import templates_events
+import markdown
# A panel can be displayed in a html page.
#
@@ -98,6 +99,86 @@ class ErrorPanel
end
+# A panel that display a markdown content rendered as HTML.
+class MDPanel
+ super Panel
+
+ # Markdown text to display.
+ var text: String
+
+ redef fun rendering do
+ add """
+
{{{text.md_to_html}}}
+
"""
+ end
+end
+
+# Display a list of active game.
+#
+# Used for NitRPG homepage.
+class GamesShortListPanel
+ super Panel
+
+ # Root url used for links.
+ var root_url: String
+
+ # List of NitRPG games to display.
+ var games: Array[Game]
+
+ redef fun render_title do
+ add " "
+ add "Active games"
+ end
+
+ redef fun render_body do
+ if games.is_empty then
+ add "No game yet..."
+ return
+ end
+ var sorted = games.to_a
+ (new GamePlayersComparator).sort(sorted)
+ for game in sorted do
+ add "{game.link} ({game.load_players.length} players)
"
+ end
+ end
+end
+
+# A panel that display a list of player in a repo.
+class GamesListPanel
+ super GamesShortListPanel
+ super TablePanel
+
+ redef fun render_title do
+ add " "
+ add "Active games"
+ end
+
+ redef fun render_body do
+ if games.is_empty then
+ add ""
+ add "No player yet..."
+ add "
"
+ return
+ end
+ var sorted = games.to_a
+ (new GamePlayersComparator).sort(sorted)
+ add """
+
+ Game |
+ Players |
+ Achievements |
+
"""
+ for game in sorted do
+ add ""
+ add " {game.link} | "
+ add " {game.load_players.length} | "
+ add " {game.load_achievements.length} | "
+ add "
"
+ end
+ add "
"
+ end
+end
+
# A panel that display repo statistics.
class GameStatusPanel
super Panel
@@ -107,12 +188,14 @@ class GameStatusPanel
redef fun render_title do
add " "
- add "{game.name}"
+ add "{game.link}"
end
redef fun render_body do
add "{game.load_players.length}"
- add " players
"
+ add " players
"
+ add "{game.stats["achievements"]}"
+ add " achievements
"
add "{game.stats["pulls"]} pull requests"
add " ({game.stats["pulls_open"]} open)
"
add "{game.stats["issues"]} issues"
@@ -135,8 +218,7 @@ class PlayerStatusPanel
add ""
add " "
- add " "
- add "{player.name}"
+ add " {player.link}"
end
redef fun render_body do
@@ -145,10 +227,10 @@ class PlayerStatusPanel
add "ranked "
add " # {ranking[player.name]}
"
add "{player.nitcoins} nitcoins
"
+ add "{player.stats["achievements"]} achievements
"
add "{player.stats["pulls"]} pull requests
"
add "{player.stats["issues"]} issues
"
add "{player.stats["commits"]} commits"
-
end
end
@@ -172,9 +254,7 @@ class ShortListPlayersPanel
end
(new PlayerCoinComparator).sort(players)
for player in players do
- add ""
- add player.name
- add " ({player.nitcoins})
"
+ add "{player.nitcoins} - {player.link}
"
end
end
end
@@ -210,7 +290,7 @@ class ListPlayersPanel
for player in players do
add ""
add " {rank} | "
- add " {player.name} | "
+ add " {player.link} | "
add " {player.nitcoins} | "
add "
"
rank += 1
@@ -256,7 +336,7 @@ class PodiumPanel
src="{{{player.user.avatar_url}}}" alt="{{{player.name}}}">
- {{{player.name}}}
+ {{{player.link}}}
{{{player.nitcoins}}}
@@ -280,16 +360,67 @@ class PlayerReviewsPanel
redef fun render_title do
add " "
- add "Review pull requests to gain nitcoins!"
+ add "Review pull requests and comment issues to gain nitcoins!"
end
redef fun render_body do
var q = "is:open label:need_review sort:updated-asc " +
"-involves:{player.name}"
- var issues = game.repo.search_issues(q)
+ var q2 = "is:open label:request_for_comments sort:updated-asc " +
+ "-involves:{player.name}"
+
+ var issues = new ArraySet[Issue]
+ issues.add_all game.repo.search_issues(q).as(not null)
+ issues.add_all game.repo.search_issues(q2).as(not null)
+ if issues.is_empty then
+ add "No pull request or issue to review yet..."
+ return
+ end
+ for issue in issues do
+ var user = issue.user
+ var uplay = user.player(game)
+ add """"""
+ end
+ end
+end
+
+# A `Panel` that displays the work assigned or tagged.
+class PlayerWorkPanel
+ super Panel
+
+ # Repo to display.
+ var game: Game
+
+ # Player to display customized list for.
+ var player: Player
+
+ redef fun render_title do
+ add " "
+ add "Do your tasks to gain nitcoins!"
+ end
+
+ redef fun render_body do
+ var q = "is:open label:need_work sort:updated-asc author:{player.name}"
+ var q2 = "is:open sort:updated-asc assignee:{player.name}"
+
+ var issues = new ArraySet[Issue]
+ issues.add_all game.repo.search_issues(q).as(not null)
+ issues.add_all game.repo.search_issues(q2).as(not null)
if issues.is_empty then
- add "No pull request to review yet..."
+ add "No work to do yet..."
return
end
for issue in issues do
@@ -302,11 +433,137 @@ class PlayerReviewsPanel
+ {{{issue.link}}} {{{issue.title}}}
+
opened by
-
{{{uplay.name}}}
+ {{{uplay.link}}}
"""
end
end
end
+
+# A `Panel` that displays a pagined list of events stored in the `entity`.
+#
+# This way the panel can be used to view events stored under `Game`, `Player`...
+class EventListPanel
+ super Panel
+
+ # Entity to load the events from.
+ var entity: GameEntity
+
+ # Number of events to display.
+ var limit: Int
+
+ # From where to start?
+ var from: Int
+
+ redef fun render_title do
+ add " "
+ add "Last events"
+ end
+
+ redef fun render_body do
+ var events = entity.load_events
+ if events.is_empty then
+ add "No event yet..."
+ return
+ end
+ # check input
+ if limit < 0 then limit = 10
+ if from < 0 then from = 0
+ # display events
+ for i in [from .. from + limit] do
+ if i >= events.length then break
+ add events[i].tpl_event.media_item
+ end
+ # pagination
+ if limit > events.length then return
+ add "
"
+ add """"""
+ if from > 0 then
+ add """
+ """
+ end
+ if from + limit < events.length then
+ add """
+
+ """
+ end
+ add "
"
+ end
+end
+
+# Achievement unlocked list panel.
+class AchievementsListPanel
+ super Panel
+
+ # Entity to load the events from.
+ var entity: GameEntity
+
+ redef fun render_title do
+ add " "
+ add "Achievements unlocked"
+ end
+
+ redef fun render_body do
+ var achs = entity.load_achievements.values.to_a
+ if achs.is_empty then
+ add "No achievement yet..."
+ return
+ end
+ for ach in achs do add ach.list_item
+ end
+end
+
+# Achievement detail panel.
+class AchievementPanel
+ super Panel
+
+ # Achievement to display.
+ var achievement: Achievement
+
+ redef fun render_title do
+ add " "
+ add "Achievement details"
+ end
+
+ redef fun render_body do
+ add """
+ +{{{achievement.reward}}}
+ {{{achievement.name}}}
+
+ {{{achievement.desc}}}
"""
+
+ var events = achievement.load_events
+
+ if events.is_empty then
+ add "Never unlocked..."
+ return
+ end
+
+ var event = events.last
+ var tpl = event.tpl_event
+ var player = tpl.player
+ add "
"
+ add """"""
+
+ if events.length > 1 then
+ add """
Also unlocked by
+ {{{events.length}}} players.
"""
+ end
+ end
+end