diff --git a/app/assets/images/pages/clans/dashboard_preview.png b/app/assets/images/pages/clans/dashboard_preview.png index ecd5f15f9..d45f8911f 100644 Binary files a/app/assets/images/pages/clans/dashboard_preview.png and b/app/assets/images/pages/clans/dashboard_preview.png differ diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 818d35730..9ca9795e7 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -790,6 +790,7 @@ make_private: "Make clan private" subs_only: "subscribers only" create_clan: "Create New Clan" + private_preview: "Preview" public_clans: "Public Clans" my_clans: "My Clans" clan_name: "Clan Name" diff --git a/app/styles/clans/clan-details.sass b/app/styles/clans/clan-details.sass index 0fda207bd..15bbda173 100644 --- a/app/styles/clans/clan-details.sass +++ b/app/styles/clans/clan-details.sass @@ -99,9 +99,23 @@ background-color: blanchedalmond font-size: 10pt - .level-progression-campaign + .level-progression-concepts + color: #317EAC font-size: 12pt font-weight: bold + margin-top: 8px + margin-bottom: 4px + + .level-progression-levels + color: #317EAC + font-size: 12pt + font-weight: bold + margin-top: 8px + + .level-progression-campaign + font-size: 10pt + font-weight: bold + margin-bottom: 4px margin-top: 4px .progress-level-cell diff --git a/app/templates/clans/clan-details.jade b/app/templates/clans/clan-details.jade index 4242610c4..e57b58c64 100644 --- a/app/templates/clans/clan-details.jade +++ b/app/templates/clans/clan-details.jade @@ -118,15 +118,15 @@ block content if isOwner && member.id !== clan.get('ownerID') button.btn.btn-xs.btn-warning.remove-member-btn(data-id="#{member.id}", data-i18n="clans.rem_hero") Remove Hero td.progress-cell - p - div.level-progression-campaign(style='color:#317EAC;') Concepts - each concept in conceptsProgression - if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'complete' - span.spr.progress-level-cell.progress-level-cell-complete(data-i18n="concepts." + concept) - else if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'started' - span.spr.progress-level-cell.progress-level-cell-started(data-i18n="concepts." + concept) - else - span.spr.progress-level-cell.progress-level-cell-not-started(data-i18n="concepts." + concept) + .level-progression-concepts Concepts + each concept in conceptsProgression + if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'complete' + span.spr.progress-level-cell.progress-level-cell-complete(data-i18n="concepts." + concept) + else if userConceptsMap[member.id] && userConceptsMap[member.id][concept] === 'started' + span.spr.progress-level-cell.progress-level-cell-started(data-i18n="concepts." + concept) + else + span.spr.progress-level-cell.progress-level-cell-not-started(data-i18n="concepts." + concept) + .level-progression-levels Levels each campaign in campaignLevelProgressions if lastUserCampaignLevelMap[member.id] && lastUserCampaignLevelMap[member.id][campaign.ID] div.level-progression-campaign= campaign.name diff --git a/app/templates/clans/clans.jade b/app/templates/clans/clans.jade index d75f511cf..a0c14444d 100644 --- a/app/templates/clans/clans.jade +++ b/app/templates/clans/clans.jade @@ -10,7 +10,7 @@ block content input(type='checkbox').private-clan-checkbox span.spl(data-i18n="clans.make_private") Make clan private span.spl ( - a.private-more-info(data-i18n="clans.subs_only") subscribers only + a.private-more-info(data-i18n="clans.private_preview") span ) p button.btn.btn-success.create-clan-btn(data-i18n="clans.create_clan") Create New Clan diff --git a/app/templates/teachers.jade b/app/templates/teachers.jade index e540565c7..925f0510b 100644 --- a/app/templates/teachers.jade +++ b/app/templates/teachers.jade @@ -48,11 +48,25 @@ block content span.spl(data-i18n="teachers.monitor_progress_4") p(data-i18n="teachers.monitor_progress_5") h4(data-i18n="teachers.sub_includes_7") - p(data-i18n="teachers.private_clans_1") + ul + li + strong Track concepts + span.spl learned by each student + li Track levels completed for each student + li + span See your students' + strong.spl solutions + li Sort students by name or progress + li + strong Requires invitation + span.spl to join + p + img(src='/images/pages/clans/dashboard_preview.png' height='400') p span.spr(data-i18n="teachers.private_clans_2") a(href='/clans', data-i18n="clans.clan") span(data-i18n="teachers.private_clans_3") + p Private clans require a subscription to create or join. h3(data-i18n="teachers.material_title") if me.get('chinaVersion') @@ -78,19 +92,19 @@ block content tbody tr td Syntax - td If/Else + td If Statements td Arithmetic td Object Literals tr td Methods td Relational Operators - td While-loops + td While Loops td Remote Method Invocation tr td Parameters td Object Properties - td Break - td For-Loops + td Break Statements + td For Loops tr td Strings td Input Handling diff --git a/app/views/clans/ClanDetailsView.coffee b/app/views/clans/ClanDetailsView.coffee index 367664a85..0ffa55e40 100644 --- a/app/views/clans/ClanDetailsView.coffee +++ b/app/views/clans/ClanDetailsView.coffee @@ -133,22 +133,34 @@ module.exports = class ClanDetailsView extends RootView @memberSessions.fetch cache: false sortMembers: (highestUserLevelCountMap, userConceptsMap) -> - # Progress sort precedence: most concepts, most levels, name sort + # Progress sort precedence: most completed concepts, most started concepts, most levels, name sort return unless @members? and @memberSort? switch @memberSort when "nameDesc" @members.comparator = (a, b) -> return (b.get('name') or 'Anoner').localeCompare(a.get('name') or 'Anoner') when "progressAsc" @members.comparator = (a, b) -> - if Object.keys(userConceptsMap[a.id]).length < Object.keys(userConceptsMap[b.id]).length then return -1 - else if Object.keys(userConceptsMap[a.id]).length > Object.keys(userConceptsMap[b.id]).length then return 1 + aComplete = (concept for concept, state of userConceptsMap[a.id] when state is 'complete') + bComplete = (concept for concept, state of userConceptsMap[b.id] when state is 'complete') + aStarted = (concept for concept, state of userConceptsMap[a.id] when state is 'started') + bStarted = (concept for concept, state of userConceptsMap[b.id] when state is 'started') + if aComplete < bComplete then return -1 + else if aComplete > bComplete then return 1 + else if aStarted < bStarted then return -1 + else if aStarted > bStarted then return 1 if highestUserLevelCountMap[a.id] < highestUserLevelCountMap[b.id] then return -1 else if highestUserLevelCountMap[a.id] > highestUserLevelCountMap[b.id] then return 1 (a.get('name') or 'Anoner').localeCompare(b.get('name') or 'Anoner') when "progressDesc" @members.comparator = (a, b) -> - if Object.keys(userConceptsMap[a.id]).length > Object.keys(userConceptsMap[b.id]).length then return -1 - else if Object.keys(userConceptsMap[a.id]).length < Object.keys(userConceptsMap[b.id]).length then return 1 + aComplete = (concept for concept, state of userConceptsMap[a.id] when state is 'complete') + bComplete = (concept for concept, state of userConceptsMap[b.id] when state is 'complete') + aStarted = (concept for concept, state of userConceptsMap[a.id] when state is 'started') + bStarted = (concept for concept, state of userConceptsMap[b.id] when state is 'started') + if aComplete > bComplete then return -1 + else if aComplete < bComplete then return 1 + else if aStarted > bStarted then return -1 + else if aStarted < bStarted then return 1 if highestUserLevelCountMap[a.id] > highestUserLevelCountMap[b.id] then return -1 else if highestUserLevelCountMap[a.id] < highestUserLevelCountMap[b.id] then return 1 (b.get('name') or 'Anoner').localeCompare(a.get('name') or 'Anoner') diff --git a/app/views/clans/ClansView.coffee b/app/views/clans/ClansView.coffee index 126086f2c..50c3d806d 100644 --- a/app/views/clans/ClansView.coffee +++ b/app/views/clans/ClansView.coffee @@ -73,9 +73,15 @@ module.exports = class ClansView extends RootView setupPrivateInfoPopover: -> popoverTitle = "<h3>Private Clans</h3>" - popoverContent = "<p>Invite only</p>" - popoverContent += "<p>Detailed dashboard:</p>" - popoverContent += "<p><img src='/images/pages/clans/dashboard_preview.png' width='700'></p>" + popoverContent = "<ul>" + popoverContent += "<li><span style='font-weight:bold;'>Track concepts</span> learned by each member" + popoverContent += "<li>Track levels completed for each member" + popoverContent += "<li>See your members' <span style='font-weight:bold;'>solutions</span>" + popoverContent += "<li>Sort members by name or progress" + popoverContent += "<li><span style='font-weight:bold;'>Requires invitation</span> to join" + popoverContent += "</ul>" + popoverContent += "<p><img src='/images/pages/clans/dashboard_preview.png' height='400'></p>" + popoverContent += "<p>Private clans require a subscription to create or join.</p>" @$el.find('.private-more-info').popover( animation: true html: true