diff --git a/app/schemas/models/clan.schema.coffee b/app/schemas/models/clan.schema.coffee index a7d646821..47c1e481a 100644 --- a/app/schemas/models/clan.schema.coffee +++ b/app/schemas/models/clan.schema.coffee @@ -7,7 +7,7 @@ _.extend ClanSchema.properties, description: {type: 'string'} members: c.array {title: 'Members'}, c.objectId() ownerID: c.objectId() - type: {type: 'string', 'enum': ['public']} + type: {type: 'string', 'enum': ['public', 'private']} c.extendBasicProperties ClanSchema, 'Clan' diff --git a/app/styles/clans/clans.sass b/app/styles/clans/clans.sass index 55e7d501d..2ae06af77 100644 --- a/app/styles/clans/clans.sass +++ b/app/styles/clans/clans.sass @@ -6,3 +6,6 @@ .create-clan-description width: 50% + + .popover + max-width: 100% diff --git a/app/templates/clans/clan-details.jade b/app/templates/clans/clan-details.jade index a23a67b96..6484dd947 100644 --- a/app/templates/clans/clan-details.jade +++ b/app/templates/clans/clan-details.jade @@ -3,7 +3,9 @@ extends /templates/base block content if clan - h1= clan.get('name') + h1 #{clan.get('name')} + if clan.get('type') === 'private' + small (private) if clan.get('description') .clan-description each line in clan.get('description').split('\n') diff --git a/app/templates/clans/clans.jade b/app/templates/clans/clans.jade index 5d87b4960..89fbbc9e0 100644 --- a/app/templates/clans/clans.jade +++ b/app/templates/clans/clans.jade @@ -6,6 +6,12 @@ block content input.create-clan-name(type='text' placeholder='New clan name') p textarea.create-clan-description(rows=2, placeholder='New clan description') + p + input(type='checkbox').private-clan-checkbox + span.spl Private + span.spl ( + a.private-more-info more info + span ) p button.btn.btn-success.create-clan-btn Create New Clan diff --git a/app/views/clans/ClanDetailsView.coffee b/app/views/clans/ClanDetailsView.coffee index da3640f9b..57b80b5ad 100644 --- a/app/views/clans/ClanDetailsView.coffee +++ b/app/views/clans/ClanDetailsView.coffee @@ -1,15 +1,16 @@ -app = require 'core/application' -AuthModal = require 'views/core/AuthModal' RootView = require 'views/core/RootView' template = require 'templates/clans/clan-details' +app = require 'core/application' +AuthModal = require 'views/core/AuthModal' CocoCollection = require 'collections/CocoCollection' Clan = require 'models/Clan' EarnedAchievement = require 'models/EarnedAchievement' LevelSession = require 'models/LevelSession' +SubscribeModal = require 'views/core/SubscribeModal' ThangType = require 'models/ThangType' User = require 'models/User' -# TODO: Message for clan not found +# TODO: Add message for clan not found # TODO: join/leave mostly duped from clans view module.exports = class ClanDetailsView extends RootView @@ -135,6 +136,8 @@ module.exports = class ClanDetailsView extends RootView onJoinClan: (e) -> return @openModalView(new AuthModal()) if me.isAnonymous() + return unless @clan.loaded + return @openModalView new SubscribeModal() if @clan.get('type') is 'private' and not me.isPremium() options = url: "/db/clan/#{@clanID}/join" method: 'PUT' diff --git a/app/views/clans/ClansView.coffee b/app/views/clans/ClansView.coffee index 5936ead1f..fc7132b33 100644 --- a/app/views/clans/ClansView.coffee +++ b/app/views/clans/ClansView.coffee @@ -4,6 +4,7 @@ RootView = require 'views/core/RootView' template = require 'templates/clans/clans' CocoCollection = require 'collections/CocoCollection' Clan = require 'models/Clan' +SubscribeModal = require 'views/core/SubscribeModal' # TODO: Waiting for async messages # TODO: Invalid clan name message @@ -28,11 +29,15 @@ module.exports = class MainAdminView extends RootView getRenderData: -> context = super() context.idNameMap = @idNameMap - context.publicClans = @publicClans.models + context.publicClans = _.filter(@publicClans.models, (clan) -> clan.get('type') is 'public') context.myClans = @myClans.models context.myClanIDs = me.get('clans') ? [] context + afterRender: -> + super() + @setupPrivateInfoPopover() + initData: -> @idNameMap = {} @@ -54,20 +59,44 @@ module.exports = class MainAdminView extends RootView @listenTo me, 'sync', => @render?() refreshNames: (clans) -> + clanIDs = _.filter(clans, (clan) -> clan.get('type') is 'public') + clanIDs = _.map(clans, (clan) -> clan.get('ownerID')) options = url: '/db/user/-/names' method: 'POST' - data: {ids: _.map(clans, (clan) -> clan.get('ownerID'))} + data: {ids: clanIDs} success: (models, response, options) => @idNameMap[userID] = models[userID].name for userID of models @render?() @supermodel.addRequestResource('user_names', options, 0).load() + setupPrivateInfoPopover: -> + popoverTitle = 'Private Clans' + popoverContent = "<p>Additional features:" + popoverContent += "<ul>" + popoverContent += "<li>Detailed progress reporting" + popoverContent += "<li>Not visible in Public Clans list below" + popoverContent += "<li>Only students with the invite link will be able to join" + popoverContent += "</ul>" + popoverContent += "<p><img src='/images/loading_image.png'></p>" + popoverContent += "<p>*A CodeCombat subscription is required to create or join private Clans.</p>" + @$el.find('.private-more-info').popover( + animation: true + html: true + placement: 'right' + trigger: 'hover' + title: popoverTitle + content: popoverContent + container: @$el + ) + onClickCreateClan: (e) -> return @openModalView(new AuthModal()) if me.isAnonymous() + clanType = if $('.private-clan-checkbox').prop('checked') then 'private' else 'public' + return @openModalView new SubscribeModal() if clanType is 'private' and not me.isPremium() if name = $('.create-clan-name').val() clan = new Clan() - clan.set 'type', 'public' + clan.set 'type', clanType clan.set 'name', name clan.set 'description', description if description = $('.create-clan-description').val() clan.save {},