refactor UserView, MainUserView

This commit is contained in:
duybkict 2016-05-26 17:19:02 +07:00 committed by Scott Erickson
parent 734c51780e
commit 4f369a1e2f
4 changed files with 70 additions and 79 deletions

View file

@ -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

View file

@ -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")

View file

@ -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'

View file

@ -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')