parent
734c51780e
commit
4f369a1e2f
4 changed files with 70 additions and 79 deletions
app
|
@ -3,11 +3,11 @@ extends /templates/base
|
||||||
// User pages might have some user page specific header, if not remove this
|
// User pages might have some user page specific header, if not remove this
|
||||||
block content
|
block content
|
||||||
.clearfix
|
.clearfix
|
||||||
if user && viewName
|
if view.userData && view.viewName
|
||||||
ol.breadcrumb
|
ol.breadcrumb
|
||||||
li
|
li
|
||||||
a(href="/user/#{user.getSlugOrID()}") #{user.displayName()}
|
a(href="/user/#{view.userData.getSlugOrID()}") #{view.userData.displayName()}
|
||||||
li.active
|
li.active
|
||||||
| #{viewName}
|
| #{view.viewName}
|
||||||
if !user || user.loading
|
if !view.userData || view.userData.loading
|
||||||
| LOADING
|
| LOADING
|
||||||
|
|
|
@ -9,24 +9,25 @@ block append content
|
||||||
a(href="/account", data-i18n="nav.account")
|
a(href="/account", data-i18n="nav.account")
|
||||||
li.active(data-i18n="nav.profile")
|
li.active(data-i18n="nav.profile")
|
||||||
|
|
||||||
if user
|
if view.user
|
||||||
|
- var playerLevel = view.user.level()
|
||||||
|
- var emails = view.user.getEnabledEmails()
|
||||||
.vertical-buffer
|
.vertical-buffer
|
||||||
.row
|
.row
|
||||||
.left-column
|
.left-column
|
||||||
.profile-wrapper
|
.profile-wrapper
|
||||||
img.picture(src="#{user.getPhotoURL(150)}" alt="")
|
img.picture(src="#{view.user.getPhotoURL(150)}" alt="")
|
||||||
div.profile-info
|
div.profile-info
|
||||||
h3.name= user.get('name')
|
h3.name= view.user.get('name')
|
||||||
if favoriteLanguage
|
if view.favoriteLanguage
|
||||||
div.extra-info
|
div.extra-info
|
||||||
span(data-i18n="user.favorite_prefix") Favorite language is
|
span(data-i18n="user.favorite_prefix") Favorite language is
|
||||||
strong.favorite-language= favoriteLanguage
|
strong.favorite-language= view.favoriteLanguage
|
||||||
span(data-i18n="user.favorite_postfix") .
|
span(data-i18n="user.favorite_postfix") .
|
||||||
if playerLevel
|
if playerLevel
|
||||||
div.extra-info
|
div.extra-info
|
||||||
span.spr(data-i18n="general.player_level") Level
|
span.spr(data-i18n="general.player_level") Level
|
||||||
strong= playerLevel
|
strong= playerLevel
|
||||||
- var emails = user.getEnabledEmails()
|
|
||||||
// TODO: fix this, use some other method for finding contributor classes other than email settings, since they're private... Maybe achievements?
|
// TODO: fix this, use some other method for finding contributor classes other than email settings, since they're private... Maybe achievements?
|
||||||
if emails
|
if emails
|
||||||
ul.contributor-categories
|
ul.contributor-categories
|
||||||
|
@ -64,22 +65,22 @@ block append content
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
h3.panel-title(data-i18n="clans.clans") Clans
|
h3.panel-title(data-i18n="clans.clans") Clans
|
||||||
if (!clans)
|
if (!view.clanModels)
|
||||||
.panel-body
|
.panel-body
|
||||||
p(data-i18n="common.loading")
|
p(data-i18n="common.loading")
|
||||||
else if (clans.length)
|
else if (view.clanModels.length)
|
||||||
table.table
|
table.table
|
||||||
tr
|
tr
|
||||||
th.col-xs-4(data-i18n="clans.name") Name
|
th.col-xs-4(data-i18n="clans.name") Name
|
||||||
th.col-xs-4(data-i18n="clans.chieftain") Chieftain
|
th.col-xs-4(data-i18n="clans.chieftain") Chieftain
|
||||||
th.col-xs-4(data-i18n="play.heroes") Heroes
|
th.col-xs-4(data-i18n="play.heroes") Heroes
|
||||||
each clan in clans
|
each clan in view.clanModels
|
||||||
tr
|
tr
|
||||||
td
|
td
|
||||||
a(href="/clans/#{clan.id}")= clan.get('name')
|
a(href="/clans/#{clan.id}")= clan.get('name')
|
||||||
td
|
td
|
||||||
if idNameMap && idNameMap[clan.get('ownerID')]
|
if view.idNameMap && view.idNameMap[clan.get('ownerID')]
|
||||||
a(href="/user/#{clan.get('ownerID')}")= idNameMap[clan.get('ownerID')]
|
a(href="/user/#{clan.get('ownerID')}")= view.idNameMap[clan.get('ownerID')]
|
||||||
else
|
else
|
||||||
a(href="/user/#{clan.get('ownerID')}") Anonymous
|
a(href="/user/#{clan.get('ownerID')}") Anonymous
|
||||||
td= clan.get('members').length
|
td= clan.get('members').length
|
||||||
|
@ -90,17 +91,17 @@ block append content
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
h3.panel-title(data-i18n="user.singleplayer_title") Singleplayer Levels
|
h3.panel-title(data-i18n="user.singleplayer_title") Singleplayer Levels
|
||||||
if (!singlePlayerSessions)
|
if (!view.singlePlayerSessions)
|
||||||
.panel-body
|
.panel-body
|
||||||
p(data-i18n="common.loading") Loading...
|
p(data-i18n="common.loading") Loading...
|
||||||
else if (singlePlayerSessions.length)
|
else if (view.singlePlayerSessions.length)
|
||||||
table.table
|
table.table
|
||||||
tr
|
tr
|
||||||
th.col-xs-4(data-i18n="resources.level") Level
|
th.col-xs-4(data-i18n="resources.level") Level
|
||||||
th.col-xs-4(data-i18n="user.last_played") Last Played
|
th.col-xs-4(data-i18n="user.last_played") Last Played
|
||||||
th.col-xs-4(data-i18n="user.status") Status
|
th.col-xs-4(data-i18n="user.status") Status
|
||||||
- var count = 0
|
- var count = 0
|
||||||
each session, index in singlePlayerSessions
|
each session, index in view.singlePlayerSessions
|
||||||
if session.get('levelName')
|
if session.get('levelName')
|
||||||
tr(class=count > 4 ? 'hide' : '')
|
tr(class=count > 4 ? 'hide' : '')
|
||||||
- count++;
|
- count++;
|
||||||
|
@ -120,16 +121,16 @@ block append content
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
h3.panel-title(data-i18n="user.multiplayer_title") Multiplayer Levels
|
h3.panel-title(data-i18n="user.multiplayer_title") Multiplayer Levels
|
||||||
if (!multiPlayerSessions)
|
if (!view.multiPlayerSessions)
|
||||||
.panel-body
|
.panel-body
|
||||||
p(data-i18n="common.loading") Loading...
|
p(data-i18n="common.loading") Loading...
|
||||||
else if (multiPlayerSessions.length)
|
else if (view.multiPlayerSessions.length)
|
||||||
table.table
|
table.table
|
||||||
tr
|
tr
|
||||||
th.col-xs-4(data-i18n="resources.level") Level
|
th.col-xs-4(data-i18n="resources.level") Level
|
||||||
th.col-xs-4(data-i18n="user.last_played") Last Played
|
th.col-xs-4(data-i18n="user.last_played") Last Played
|
||||||
th.col-xs-4(data-i18n="general.score") Score
|
th.col-xs-4(data-i18n="general.score") Score
|
||||||
each session, index in multiPlayerSessions
|
each session, index in view.multiPlayerSessions
|
||||||
tr(class=index > 4 ? 'hide' : '')
|
tr(class=index > 4 ? 'hide' : '')
|
||||||
td
|
td
|
||||||
- var posturl = ''
|
- var posturl = ''
|
||||||
|
@ -140,7 +141,7 @@ block append content
|
||||||
td= parseInt(session.get('totalScore') * 100)
|
td= parseInt(session.get('totalScore') * 100)
|
||||||
else
|
else
|
||||||
td(data-i18n="user.status_unfinished") Unfinished
|
td(data-i18n="user.status_unfinished") Unfinished
|
||||||
if multiPlayerSessions.length > 4
|
if view.multiPlayerSessions.length > 4
|
||||||
.panel-footer
|
.panel-footer
|
||||||
button.btn.btn-info.btn-sm.more-button(data-i18n="editor.more")
|
button.btn.btn-info.btn-sm.more-button(data-i18n="editor.more")
|
||||||
else
|
else
|
||||||
|
@ -149,10 +150,10 @@ block append content
|
||||||
.panel.panel-default
|
.panel.panel-default
|
||||||
.panel-heading
|
.panel-heading
|
||||||
h3.panel-title(data-i18n="user.achievements_title") Achievements
|
h3.panel-title(data-i18n="user.achievements_title") Achievements
|
||||||
if ! earnedAchievements
|
if ! view.earnedAchievements
|
||||||
.panel-body
|
.panel-body
|
||||||
p(data-i18n="common.loading") Loading...
|
p(data-i18n="common.loading") Loading...
|
||||||
else if ! earnedAchievements.length
|
else if ! view.earnedAchievements.length
|
||||||
.panel-body
|
.panel-body
|
||||||
p(data-i18n="user.no_achievements") No achievements earned so far.
|
p(data-i18n="user.no_achievements") No achievements earned so far.
|
||||||
else
|
else
|
||||||
|
@ -161,7 +162,7 @@ block append content
|
||||||
th.col-xs-4(data-i18n="achievements.achievement") Achievement
|
th.col-xs-4(data-i18n="achievements.achievement") Achievement
|
||||||
th.col-xs-4(data-i18n="achievements.last_earned") Last Earned
|
th.col-xs-4(data-i18n="achievements.last_earned") Last Earned
|
||||||
th.col-xs-4(data-i18n="achievements.amount_achieved") Amount
|
th.col-xs-4(data-i18n="achievements.amount_achieved") Amount
|
||||||
each achievement, index in earnedAchievements.models
|
each achievement, index in view.earnedAchievements.models
|
||||||
tr(class=index > 4 ? 'hide' : '')
|
tr(class=index > 4 ? 'hide' : '')
|
||||||
td= achievement.get('achievementName')
|
td= achievement.get('achievementName')
|
||||||
td= moment(achievement.get('changed')).format("MMMM Do YYYY")
|
td= moment(achievement.get('changed')).format("MMMM Do YYYY")
|
||||||
|
@ -169,6 +170,6 @@ block append content
|
||||||
td= achievement.get('achievedAmount')
|
td= achievement.get('achievedAmount')
|
||||||
else
|
else
|
||||||
td
|
td
|
||||||
if earnedAchievements.length > 4
|
if view.earnedAchievements.length > 4
|
||||||
.panel-footer
|
.panel-footer
|
||||||
button.btn.btn-info.btn-sm.more-button(data-i18n="editor.more")
|
button.btn.btn-info.btn-sm.more-button(data-i18n="editor.more")
|
||||||
|
|
|
@ -19,21 +19,12 @@ module.exports = class UserView extends RootView
|
||||||
@user = new User _id: @userID
|
@user = new User _id: @userID
|
||||||
@supermodel.loadModel @user, cache: false
|
@supermodel.loadModel @user, cache: false
|
||||||
|
|
||||||
getRenderData: ->
|
|
||||||
context = super()
|
|
||||||
context.viewName = @viewName
|
|
||||||
context.user = @user unless @user?.isAnonymous()
|
|
||||||
context
|
|
||||||
|
|
||||||
isMe: -> @userID in [me.id, me.get('slug')]
|
isMe: -> @userID in [me.id, me.get('slug')]
|
||||||
|
|
||||||
onLoaded: ->
|
onLoaded: ->
|
||||||
@onUserLoaded @user if @user.loaded and not @userLoaded
|
@userData = @user unless @user?.isAnonymous()
|
||||||
super()
|
|
||||||
|
|
||||||
onUserLoaded: ->
|
|
||||||
@userID = @user.id
|
@userID = @user.id
|
||||||
@userLoaded = true
|
super()
|
||||||
|
|
||||||
ifUserNotFound: ->
|
ifUserNotFound: ->
|
||||||
console.warn 'user not found'
|
console.warn 'user not found'
|
||||||
|
|
|
@ -26,59 +26,39 @@ module.exports = class MainUserView extends UserView
|
||||||
destroy: ->
|
destroy: ->
|
||||||
@stopListening?()
|
@stopListening?()
|
||||||
|
|
||||||
getRenderData: ->
|
|
||||||
context = super()
|
|
||||||
if @levelSessions and @levelSessions.loaded
|
|
||||||
singlePlayerSessions = []
|
|
||||||
multiPlayerSessions = []
|
|
||||||
languageCounts = {}
|
|
||||||
for levelSession in @levelSessions.models
|
|
||||||
if levelSession.isMultiplayer()
|
|
||||||
multiPlayerSessions.push levelSession
|
|
||||||
else
|
|
||||||
singlePlayerSessions.push levelSession
|
|
||||||
language = levelSession.get('codeLanguage') or levelSession.get('submittedCodeLanguage')
|
|
||||||
if language
|
|
||||||
languageCounts[language] = (languageCounts[language] or 0) + 1
|
|
||||||
mostUsedCount = 0
|
|
||||||
favoriteLanguage = null
|
|
||||||
for language, count of languageCounts
|
|
||||||
if count > mostUsedCount
|
|
||||||
mostUsedCount = count
|
|
||||||
favoriteLanguage = language
|
|
||||||
context.singlePlayerSessions = singlePlayerSessions
|
|
||||||
context.multiPlayerSessions = multiPlayerSessions
|
|
||||||
context.favoriteLanguage = favoriteLanguage
|
|
||||||
context.playerLevel = @user.level()
|
|
||||||
if @earnedAchievements and @earnedAchievements.loaded
|
|
||||||
context.earnedAchievements = @earnedAchievements
|
|
||||||
if @clans and @clans.loaded
|
|
||||||
context.clans = @clans.models
|
|
||||||
context.idNameMap = @idNameMap
|
|
||||||
context
|
|
||||||
|
|
||||||
onLoaded: ->
|
onLoaded: ->
|
||||||
if @user.loaded and not (@earnedAchievements or @levelSessions)
|
if @user.loaded
|
||||||
@supermodel.resetProgress()
|
if !@levelSessions
|
||||||
@levelSessions = new LevelSessionsCollection @user.getSlugOrID()
|
@levelSessions = new LevelSessionsCollection @user.getSlugOrID()
|
||||||
@earnedAchievements = new EarnedAchievementCollection @user.getSlugOrID()
|
@listenTo @levelSessions, 'sync', =>
|
||||||
@supermodel.loadCollection @levelSessions, 'levelSessions', {cache: false}
|
@onSyncLevelSessions @levelSessions?.models
|
||||||
@supermodel.loadCollection @earnedAchievements, 'earnedAchievements', {cache: false}
|
@render()
|
||||||
|
@supermodel.loadCollection @levelSessions, 'levelSessions', {cache: false}
|
||||||
|
|
||||||
|
if !@earnedAchievements
|
||||||
|
@earnedAchievements = new EarnedAchievementCollection @user.getSlugOrID()
|
||||||
|
@listenTo @earnedAchievements, 'sync', =>
|
||||||
|
@render()
|
||||||
|
@supermodel.loadCollection @earnedAchievements, 'earnedAchievements', {cache: false}
|
||||||
|
|
||||||
sortClanList = (a, b) ->
|
sortClanList = (a, b) ->
|
||||||
if a.get('members').length isnt b.get('members').length
|
if a.get('members').length isnt b.get('members').length
|
||||||
if a.get('members').length < b.get('members').length then 1 else -1
|
if a.get('members').length < b.get('members').length then 1 else -1
|
||||||
else
|
else
|
||||||
b.id.localeCompare(a.id)
|
b.id.localeCompare(a.id)
|
||||||
@idNameMap = {}
|
|
||||||
@clans = new CocoCollection([], { url: "/db/user/#{@userID}/clans", model: Clan, comparator: sortClanList })
|
@clans = new CocoCollection([], { url: "/db/user/#{@userID}/clans", model: Clan, comparator: sortClanList })
|
||||||
@listenTo @clans, 'sync', =>
|
@listenTo @clans, 'sync', =>
|
||||||
@refreshNameMap @clans?.models
|
@onSyncClans @clans?.models
|
||||||
@render?()
|
@render?()
|
||||||
@supermodel.loadCollection(@clans, 'clans', {cache: false})
|
@supermodel.loadCollection(@clans, 'clans', {cache: false})
|
||||||
|
|
||||||
super()
|
super()
|
||||||
|
|
||||||
refreshNameMap: (clans) ->
|
onSyncClans: (clans) ->
|
||||||
return unless clans?
|
return unless clans?
|
||||||
|
@idNameMap = []
|
||||||
|
@clanModels = clans
|
||||||
options =
|
options =
|
||||||
url: '/db/user/-/names'
|
url: '/db/user/-/names'
|
||||||
method: 'POST'
|
method: 'POST'
|
||||||
|
@ -88,6 +68,25 @@ module.exports = class MainUserView extends UserView
|
||||||
@render?()
|
@render?()
|
||||||
@supermodel.addRequestResource('user_names', options, 0).load()
|
@supermodel.addRequestResource('user_names', options, 0).load()
|
||||||
|
|
||||||
|
onSyncLevelSessions: (levelSessions) ->
|
||||||
|
return unless levelSessions?
|
||||||
|
@multiPlayerSessions = []
|
||||||
|
@singlePlayerSessions = []
|
||||||
|
languageCounts = []
|
||||||
|
mostUsedCount = 0
|
||||||
|
for levelSession in levelSessions
|
||||||
|
if levelSession.isMultiplayer()
|
||||||
|
@multiPlayerSessions.push levelSession
|
||||||
|
else
|
||||||
|
@singlePlayerSessions.push levelSession
|
||||||
|
language = levelSession.get('codeLanguage') or levelSession.get('submittedCodeLanguage')
|
||||||
|
if language
|
||||||
|
languageCounts[language] = (languageCounts[language] or 0) + 1
|
||||||
|
for language, count of languageCounts
|
||||||
|
if count > mostUsedCount
|
||||||
|
mostUsedCount = count
|
||||||
|
@favoriteLanguage = language
|
||||||
|
|
||||||
onClickMoreButton: (e) ->
|
onClickMoreButton: (e) ->
|
||||||
panel = $(e.target).closest('.panel')
|
panel = $(e.target).closest('.panel')
|
||||||
panel.find('tr.hide').removeClass('hide')
|
panel.find('tr.hide').removeClass('hide')
|
||||||
|
|
Reference in a new issue