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 """ + + + + + """ + for game in sorted do + add "" + add " " + add " " + add " " + add "" + end + add "
GamePlayersAchievements
{game.link}{game.load_players.length}{game.load_achievements.length}
" + 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 " \"{player.name}\"" - 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 """
+ + {{{uplay.name}}} + +
+

+ {{{issue.link}}} {{{issue.title}}} +

+ opened by + {{{uplay.link}}} +
+
""" + 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.number}}} {{{issue.title}}}

+ {{{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 """
+ + #1 + {{{player.name}}} + +
+

Unlocked first by {{{player.link}}}

+ at {{{event.time}}} +
+
""" + + if events.length > 1 then + add """


Also unlocked by + {{{events.length}}} players.

""" + end + end +end