Merge branch 'codecombat-master'
This commit is contained in:
commit
d0840cc944
45 changed files with 566 additions and 442 deletions
app
lib
locale
models
schemas
styles
templates
treema-ext.coffeeviews
server
levels/components
patches
queues
routes
users
|
@ -44,7 +44,7 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
return @openRoute(args.join('/'))
|
return @openRoute(args.join('/'))
|
||||||
view = new ViewClass({}, slugOrId)
|
view = new ViewClass({}, slugOrId)
|
||||||
view.render()
|
view.render()
|
||||||
if view then @openView(view) else @showNotFound()
|
@openView if view then view else @notFoundView()
|
||||||
|
|
||||||
cache: {}
|
cache: {}
|
||||||
openRoute: (route) ->
|
openRoute: (route) ->
|
||||||
|
@ -99,7 +99,7 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
return document.location.reload()
|
return document.location.reload()
|
||||||
path = "views/#{path}"
|
path = "views/#{path}"
|
||||||
ViewClass = @tryToLoadModule path
|
ViewClass = @tryToLoadModule path
|
||||||
return @showNotFound() if not ViewClass
|
return @openView @notFoundView() if not ViewClass
|
||||||
view = new ViewClass({}, args...) # options, then any path fragment args
|
view = new ViewClass({}, args...) # options, then any path fragment args
|
||||||
view.render()
|
view.render()
|
||||||
@openView(view)
|
@openView(view)
|
||||||
|
@ -117,7 +117,7 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
break if ViewClass
|
break if ViewClass
|
||||||
split -= 1
|
split -= 1
|
||||||
|
|
||||||
return @showNotFound() if not ViewClass
|
return @notFoundView() if not ViewClass
|
||||||
args = pieces[split+1..]
|
args = pieces[split+1..]
|
||||||
view = new ViewClass({}, args...) # options, then any path fragment args
|
view = new ViewClass({}, args...) # options, then any path fragment args
|
||||||
view.render()
|
view.render()
|
||||||
|
@ -129,7 +129,7 @@ module.exports = class CocoRouter extends Backbone.Router
|
||||||
if error.toString().search('Cannot find module "' + path + '" from') is -1
|
if error.toString().search('Cannot find module "' + path + '" from') is -1
|
||||||
throw error
|
throw error
|
||||||
|
|
||||||
showNotFound: ->
|
notFoundView: ->
|
||||||
NotFoundView = require('views/not_found')
|
NotFoundView = require('views/not_found')
|
||||||
view = new NotFoundView()
|
view = new NotFoundView()
|
||||||
view.render()
|
view.render()
|
||||||
|
|
|
@ -12,7 +12,7 @@ init = ->
|
||||||
me.set 'testGroupNumber', Math.floor(Math.random() * 256)
|
me.set 'testGroupNumber', Math.floor(Math.random() * 256)
|
||||||
me.patch()
|
me.patch()
|
||||||
|
|
||||||
Backbone.listenTo(me, 'sync', Backbone.Mediator.publish('me:synced', {me: me}))
|
Backbone.listenTo(me, 'sync', -> Backbone.Mediator.publish('me:synced', {me: me}))
|
||||||
|
|
||||||
module.exports.createUser = (userObject, failure=backboneFailure, nextURL=null) ->
|
module.exports.createUser = (userObject, failure=backboneFailure, nextURL=null) ->
|
||||||
user = new User(userObject)
|
user = new User(userObject)
|
||||||
|
|
|
@ -72,11 +72,14 @@ module.exports = class Mark extends CocoClass
|
||||||
color = "rgba(#{colors[0]}, #{colors[1]}, #{colors[2]}, 0.5)"
|
color = "rgba(#{colors[0]}, #{colors[1]}, #{colors[2]}, 0.5)"
|
||||||
[w, h] = [@sprite.thang.width * Camera.PPM, @sprite.thang.height * Camera.PPM * @camera.y2x]
|
[w, h] = [@sprite.thang.width * Camera.PPM, @sprite.thang.height * Camera.PPM * @camera.y2x]
|
||||||
|
|
||||||
if @sprite.thang.drawsBoundsStyle is 'border-text'
|
if @sprite.thang.drawsBoundsStyle in ['border-text', 'corner-text']
|
||||||
shape = new createjs.Shape()
|
@drawsBoundsBorderShape = shape = new createjs.Shape()
|
||||||
shape.graphics.setStrokeStyle 5
|
shape.graphics.setStrokeStyle 5
|
||||||
shape.graphics.beginStroke color
|
shape.graphics.beginStroke color
|
||||||
shape.graphics.beginFill color.replace('0.5', '0.25')
|
if @sprite.thang.drawsBoundsStyle is 'border-text'
|
||||||
|
shape.graphics.beginFill color.replace('0.5', '0.25')
|
||||||
|
else
|
||||||
|
shape.graphics.beginFill color
|
||||||
if @sprite.thang.shape in ['ellipsoid', 'disc']
|
if @sprite.thang.shape in ['ellipsoid', 'disc']
|
||||||
shape.drawEllipse 0, 0, w, h
|
shape.drawEllipse 0, 0, w, h
|
||||||
else
|
else
|
||||||
|
@ -101,7 +104,7 @@ module.exports = class Mark extends CocoClass
|
||||||
else
|
else
|
||||||
console.warn @sprite.thang.id, 'didn\'t know how to draw bounds style:', @sprite.thang.drawsBoundsStyle
|
console.warn @sprite.thang.id, 'didn\'t know how to draw bounds style:', @sprite.thang.drawsBoundsStyle
|
||||||
|
|
||||||
if w > 0 and h > 0
|
if w > 0 and h > 0 and @sprite.thang.drawsBoundsStyle is 'border-text'
|
||||||
@mark.cache -w / 2, -h / 2, w, h, 2
|
@mark.cache -w / 2, -h / 2, w, h, 2
|
||||||
@lastWidth = @sprite.thang.width
|
@lastWidth = @sprite.thang.width
|
||||||
@lastHeight = @sprite.thang.height
|
@lastHeight = @sprite.thang.height
|
||||||
|
@ -226,13 +229,12 @@ module.exports = class Mark extends CocoClass
|
||||||
@highlightTween = createjs.Tween.get(@mark).to({}, @highlightDelay).call =>
|
@highlightTween = createjs.Tween.get(@mark).to({}, @highlightDelay).call =>
|
||||||
@mark.visible = true
|
@mark.visible = true
|
||||||
@highlightDelay = @highlightTween = null
|
@highlightDelay = @highlightTween = null
|
||||||
|
@updateAlpha @alpha if @name in ['shadow', 'bounds']
|
||||||
true
|
true
|
||||||
|
|
||||||
updatePosition: (pos) ->
|
updatePosition: (pos) ->
|
||||||
if @sprite?.thang and @name in ['shadow', 'debug', 'target', 'selection', 'repair']
|
if @sprite?.thang and @name in ['shadow', 'debug', 'target', 'selection', 'repair']
|
||||||
pos = @camera.worldToSurface x: @sprite.thang.pos.x, y: @sprite.thang.pos.y
|
pos = @camera.worldToSurface x: @sprite.thang.pos.x, y: @sprite.thang.pos.y
|
||||||
if @name is 'shadow'
|
|
||||||
@updateAlpha @alpha
|
|
||||||
else
|
else
|
||||||
pos ?= @sprite?.imageObject
|
pos ?= @sprite?.imageObject
|
||||||
@mark.x = pos.x
|
@mark.x = pos.x
|
||||||
|
@ -248,7 +250,9 @@ module.exports = class Mark extends CocoClass
|
||||||
if @name is 'shadow'
|
if @name is 'shadow'
|
||||||
worldZ = @sprite.thang.pos.z - @sprite.thang.depth / 2 + @sprite.getBobOffset()
|
worldZ = @sprite.thang.pos.z - @sprite.thang.depth / 2 + @sprite.getBobOffset()
|
||||||
@mark.alpha = @alpha * 0.451 / Math.sqrt(worldZ / 2 + 1)
|
@mark.alpha = @alpha * 0.451 / Math.sqrt(worldZ / 2 + 1)
|
||||||
else if @name isnt 'bounds'
|
else if @name is 'bounds'
|
||||||
|
@drawsBoundsBorderShape?.alpha = Math.floor @sprite.thang.alpha # Stop drawing bounds as soon as alpha is reduced at all
|
||||||
|
else
|
||||||
@mark.alpha = @alpha
|
@mark.alpha = @alpha
|
||||||
|
|
||||||
updateRotation: ->
|
updateRotation: ->
|
||||||
|
|
|
@ -111,6 +111,8 @@ module.exports = class SpriteBoss extends CocoClass
|
||||||
sprite.targetPos = if opponent.team is 'ogres' then {x: 52, y: 52} else {x: 28, y: 28}
|
sprite.targetPos = if opponent.team is 'ogres' then {x: 52, y: 52} else {x: 28, y: 28}
|
||||||
else if opponent.levelSlug is 'dungeon-arena'
|
else if opponent.levelSlug is 'dungeon-arena'
|
||||||
sprite.targetPos = if opponent.team is 'ogres' then {x: 72, y: 39} else {x: 9, y: 39}
|
sprite.targetPos = if opponent.team is 'ogres' then {x: 72, y: 39} else {x: 9, y: 39}
|
||||||
|
else if opponent.levelSlug is 'criss-cross'
|
||||||
|
sprite.targetPos = if opponent.team is 'ogres' then {x: 50, y: 12} else {x: 0, y: 40}
|
||||||
else
|
else
|
||||||
sprite.targetPos = if opponent.team is 'ogres' then {x: 52, y: 28} else {x: 20, y: 28}
|
sprite.targetPos = if opponent.team is 'ogres' then {x: 52, y: 28} else {x: 20, y: 28}
|
||||||
|
|
||||||
|
|
|
@ -236,7 +236,7 @@
|
||||||
basics_country: "Country"
|
basics_country: "Country"
|
||||||
basics_country_help: "Country you want to work in (or live in now)."
|
basics_country_help: "Country you want to work in (or live in now)."
|
||||||
basics_visa: "US Work Status"
|
basics_visa: "US Work Status"
|
||||||
basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship?"
|
basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.)"
|
||||||
basics_looking_for: "Looking For"
|
basics_looking_for: "Looking For"
|
||||||
basics_looking_for_full_time: "Full-time"
|
basics_looking_for_full_time: "Full-time"
|
||||||
basics_looking_for_part_time: "Part-time"
|
basics_looking_for_part_time: "Part-time"
|
||||||
|
|
|
@ -187,13 +187,13 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
|
||||||
saved: "Változtatások elmentve"
|
saved: "Változtatások elmentve"
|
||||||
password_mismatch: "A jelszavak nem egyeznek."
|
password_mismatch: "A jelszavak nem egyeznek."
|
||||||
job_profile: "Munkaköri leírás"
|
job_profile: "Munkaköri leírás"
|
||||||
job_profile_approved: "Munkaköri leírásodat a Codecombat jóváhagyta. Munkaadók mindaddig láthatják, amíg meg nem jelölöd inaktíként, vagy négy hétig,ha addig nem kerül megváltoztatásra."
|
job_profile_approved: "Munkaköri leírásodat a Codecombat jóváhagyta. Munkaadók mindaddig láthatják, amíg meg nem jelölöd inaktívként, vagy négy hétig, ha addig nem kerül megváltoztatásra."
|
||||||
job_profile_explanation: "Szió! Töltsd ki ezt és majd kapcsolatba lépünk veled és keresünk neked egy szoftware fejlesztői állást."
|
job_profile_explanation: "Szió! Töltsd ki ezt és majd kapcsolatba lépünk veled és keresünk neked egy szoftware fejlesztői állást."
|
||||||
sample_profile: "Nézz meg egy mintaprofilt!"
|
sample_profile: "Nézz meg egy mintaprofilt!"
|
||||||
view_profile: "Nézd meg a profilodat!"
|
view_profile: "Nézd meg a profilodat!"
|
||||||
|
|
||||||
account_profile:
|
account_profile:
|
||||||
# settings: "Settings"
|
settings: "Beállítások"
|
||||||
edit_profile: "Szerkeszd meg a profilodat"
|
edit_profile: "Szerkeszd meg a profilodat"
|
||||||
done_editing: "Szerkesztés kész"
|
done_editing: "Szerkesztés kész"
|
||||||
profile_for_prefix: "Profil "
|
profile_for_prefix: "Profil "
|
||||||
|
@ -205,10 +205,10 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
|
||||||
contact: "Kapcsolat"
|
contact: "Kapcsolat"
|
||||||
active: "Azonnali interjú ajánlatokat keresek"
|
active: "Azonnali interjú ajánlatokat keresek"
|
||||||
inactive: "Most éppen nem keresek interjú ajánlatokat"
|
inactive: "Most éppen nem keresek interjú ajánlatokat"
|
||||||
# complete: "complete"
|
complete: "befejezve"
|
||||||
next: "Következő"
|
next: "Következő"
|
||||||
next_city: "Város?"
|
next_city: "Város?"
|
||||||
# next_country: "pick your country."
|
next_country: "válaszd ki az országot."
|
||||||
next_name: "Név?"
|
next_name: "Név?"
|
||||||
next_short_description: "adj egy rövid leírást."
|
next_short_description: "adj egy rövid leírást."
|
||||||
# next_long_description: "describe your desired position."
|
# next_long_description: "describe your desired position."
|
||||||
|
@ -231,16 +231,16 @@ module.exports = nativeDescription: "magyar", englishDescription: "Hungarian", t
|
||||||
# basics_active_help: "Want interview offers right now?"
|
# basics_active_help: "Want interview offers right now?"
|
||||||
# basics_job_title: "Desired Job Title"
|
# basics_job_title: "Desired Job Title"
|
||||||
# basics_job_title_help: "What role are you looking for?"
|
# basics_job_title_help: "What role are you looking for?"
|
||||||
# basics_city: "City"
|
basics_city: "Város"
|
||||||
# basics_city_help: "City you want to work in (or live in now)."
|
basics_city_help: "A város, ahol dolgozni akarsz (vagy ahol élsz)"
|
||||||
# basics_country: "Country"
|
basics_country: "Ország"
|
||||||
# basics_country_help: "Country you want to work in (or live in now)."
|
# basics_country_help: "Country you want to work in (or live in now)."
|
||||||
# basics_visa: "US Work Status"
|
# basics_visa: "US Work Status"
|
||||||
# basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship?"
|
# basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship?"
|
||||||
# basics_looking_for: "Looking For"
|
# basics_looking_for: "Looking For"
|
||||||
# basics_looking_for_full_time: "Full-time"
|
basics_looking_for_full_time: "Teljes munkaidőben"
|
||||||
# basics_looking_for_part_time: "Part-time"
|
basics_looking_for_part_time: "Részmunkaidőben"
|
||||||
# basics_looking_for_remote: "Remote"
|
basics_looking_for_remote: "Távmunkában"
|
||||||
# basics_looking_for_contracting: "Contracting"
|
# basics_looking_for_contracting: "Contracting"
|
||||||
# basics_looking_for_internship: "Internship"
|
# basics_looking_for_internship: "Internship"
|
||||||
# basics_looking_for_help: "What kind of developer position do you want?"
|
# basics_looking_for_help: "What kind of developer position do you want?"
|
||||||
|
|
|
@ -3,37 +3,37 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P
|
||||||
loading: "A carregar..."
|
loading: "A carregar..."
|
||||||
saving: "A guardar..."
|
saving: "A guardar..."
|
||||||
sending: "A enviar..."
|
sending: "A enviar..."
|
||||||
# send: "Send"
|
send: "Enviar"
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
save: "Guardar"
|
save: "Guardar"
|
||||||
# publish: "Publish"
|
publish: "Publicar"
|
||||||
create: "Create"
|
create: "Criar"
|
||||||
delay_1_sec: "1 segundo"
|
delay_1_sec: "1 segundo"
|
||||||
delay_3_sec: "3 segundos"
|
delay_3_sec: "3 segundos"
|
||||||
delay_5_sec: "5 segundos"
|
delay_5_sec: "5 segundos"
|
||||||
manual: "Manual"
|
manual: "Manual"
|
||||||
fork: "Fork"
|
# fork: "Fork"
|
||||||
play: "Jogar"
|
play: "Jogar"
|
||||||
# retry: "Retry"
|
retry: "Tentar novamente"
|
||||||
# watch: "Watch"
|
# watch: "Watch"
|
||||||
# unwatch: "Unwatch"
|
# unwatch: "Unwatch"
|
||||||
# submit_patch: "Submit Patch"
|
submit_patch: "Submeter Versão"
|
||||||
|
|
||||||
# units:
|
units:
|
||||||
# second: "second"
|
second: "segundo"
|
||||||
# seconds: "seconds"
|
seconds: "segundos"
|
||||||
# minute: "minute"
|
minute: "minuto"
|
||||||
# minutes: "minutes"
|
minutes: "minutos"
|
||||||
# hour: "hour"
|
hour: "hora"
|
||||||
# hours: "hours"
|
hours: "horas"
|
||||||
# day: "day"
|
day: "dia"
|
||||||
# days: "days"
|
days: "dias"
|
||||||
# week: "week"
|
week: "semana"
|
||||||
# weeks: "weeks"
|
weeks: "semanas"
|
||||||
# month: "month"
|
month: "mês"
|
||||||
# months: "months"
|
months: "meses"
|
||||||
# year: "year"
|
year: "ano"
|
||||||
# years: "years"
|
years: "anos"
|
||||||
|
|
||||||
modal:
|
modal:
|
||||||
close: "Fechar"
|
close: "Fechar"
|
||||||
|
@ -43,88 +43,88 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P
|
||||||
page_not_found: "Página não encontrada"
|
page_not_found: "Página não encontrada"
|
||||||
|
|
||||||
nav:
|
nav:
|
||||||
play: "Jogar"
|
play: "Níveis"
|
||||||
# community: "Community"
|
community: "Comunidade"
|
||||||
editor: "Editor"
|
editor: "Editor"
|
||||||
blog: "Blog"
|
blog: "Blog"
|
||||||
forum: "Fórum"
|
forum: "Fórum"
|
||||||
# account: "Account"
|
account: "Conta"
|
||||||
admin: "Administrador"
|
admin: "Administrador"
|
||||||
home: "Início"
|
home: "Início"
|
||||||
contribute: "Contribuir"
|
contribute: "Contribuir"
|
||||||
legal: "Legal"
|
legal: "Legal"
|
||||||
about: "Sobre"
|
about: "Sobre"
|
||||||
contact: "Contacto"
|
contact: "Contacte"
|
||||||
twitter_follow: "Seguir"
|
twitter_follow: "Seguir"
|
||||||
employers: "Patrões"
|
employers: "Empregadores"
|
||||||
|
|
||||||
versions:
|
versions:
|
||||||
save_version_title: "Guardar Nova Versão"
|
save_version_title: "Guardar Nova Versão"
|
||||||
new_major_version: "Nova Versão Principal"
|
new_major_version: "Nova Versão Principal"
|
||||||
cla_prefix: "Para guardar as alterações, precisas concordar com o nosso"
|
cla_prefix: "Para guardar as alterações, precisa de concordar com o nosso"
|
||||||
cla_url: "CLA"
|
cla_url: "CLA"
|
||||||
cla_suffix: "."
|
cla_suffix: "."
|
||||||
cla_agree: "EU CONCORDO"
|
cla_agree: "EU CONCORDO"
|
||||||
|
|
||||||
login:
|
login:
|
||||||
sign_up: "Criar conta"
|
sign_up: "Criar Conta"
|
||||||
log_in: "Iniciar sessão"
|
log_in: "Iniciar Sessão"
|
||||||
# logging_in: "Logging In"
|
logging_in: "A Iniciar Sessão"
|
||||||
log_out: "Sair"
|
log_out: "Sair"
|
||||||
recover: "recuperar conta"
|
recover: "recuperar conta"
|
||||||
|
|
||||||
recover:
|
recover:
|
||||||
recover_account_title: "Recuperar conta"
|
recover_account_title: "Recuperar Conta"
|
||||||
send_password: "Recuperar password"
|
send_password: "Enviar Password de Recuperação"
|
||||||
|
|
||||||
signup:
|
signup:
|
||||||
create_account_title: "Cria uma conta para guardar o teu progresso."
|
create_account_title: "Criar Conta para Guardar Progresso"
|
||||||
description: "É grátis. Só precisamos de umas coisas e fica tudo pronto:"
|
description: "É grátis. Só são necessárias umas coisas e fica tudo pronto:"
|
||||||
email_announcements: "Receber anúncios por e-mail"
|
email_announcements: "Receber anúncios por e-mail"
|
||||||
coppa: "13+ ou não-EUA "
|
coppa: "13+ ou não-EUA "
|
||||||
coppa_why: "(Porquê?)"
|
coppa_why: "(Porquê?)"
|
||||||
creating: "A criar conta..."
|
creating: "A Criar Conta..."
|
||||||
sign_up: "Registar"
|
sign_up: "Registar"
|
||||||
log_in: "iniciar sessão com palavra-passe"
|
log_in: "iniciar sessão com palavra-passe"
|
||||||
# social_signup: "Or, you can sign up through Facebook or G+:"
|
social_signup: "Ou pode registar-se através do Facebook ou do Google+:"
|
||||||
# required: "You need to log in before you can go that way."
|
required: "Precisa de iniciar sessão antes de prosseguir dessa forma."
|
||||||
|
|
||||||
home:
|
home:
|
||||||
slogan: "Aprende a Programar ao Jogar um Jogo"
|
slogan: "Aprenda a Programar ao Jogar um Jogo"
|
||||||
no_ie: "O CodeCombat não corre em Internet Explorer 9 ou anterior. Desculpa!"
|
no_ie: "O CodeCombat não funciona no Internet Explorer 9 ou anterior. Desculpe!"
|
||||||
no_mobile: "O CodeCombat não foi desenhado para dispositivos móveis e pode não funcionar!"
|
no_mobile: "O CodeCombat não foi feito para dispositivos móveis e pode não funcionar!"
|
||||||
play: "Jogar"
|
play: "Jogar"
|
||||||
old_browser: "Ups, o teu browser é demasiado antigo para correr o CodeCombat. Desculpa!"
|
old_browser: "Ups, o seu navegador é demasiado antigo para que o CodeCombat funcione. Desculpe!"
|
||||||
old_browser_suffix: "Mesmo assim podes tentar, mas provavelmente não vai funcionar."
|
old_browser_suffix: "Mesmo assim pode tentar, mas provavelmente não irá funcionar."
|
||||||
campaign: "Campanha"
|
campaign: "Campanha"
|
||||||
for_beginners: "Para Iniciantes"
|
for_beginners: "Para Iniciantes"
|
||||||
multiplayer: "Multiplayer"
|
multiplayer: "Multijogador"
|
||||||
for_developers: "Para Programadores"
|
for_developers: "Para Programadores"
|
||||||
|
|
||||||
play:
|
play:
|
||||||
choose_your_level: "Escolhe o Teu Nível"
|
choose_your_level: "Escolha o Seu Nível"
|
||||||
adventurer_prefix: "Podes saltar para um dos níveis abaixo, ou discutir os níveis "
|
adventurer_prefix: "Pode saltar para um dos níveis abaixo ou discutir os níveis no "
|
||||||
adventurer_forum: "no fórum de Aventureiro"
|
adventurer_forum: "fórum do Aventureiro"
|
||||||
adventurer_suffix: "."
|
adventurer_suffix: "."
|
||||||
campaign_beginner: "Campanha para Iniciantes"
|
campaign_beginner: "Campanha para Iniciantes"
|
||||||
campaign_beginner_description: "... onde aprendes a feitiçaria da programação."
|
campaign_beginner_description: "... onde aprende a feitiçaria da programação."
|
||||||
campaign_dev: "Níveis mais Difíceis"
|
campaign_dev: "Níveis mais Difíceis Aleatórios"
|
||||||
campaign_dev_description: "... onde aprendes a interface enquanto fazes coisas um bocadinho mais difíceis."
|
campaign_dev_description: "... onde aprende a interface enquanto faz coisas um bocadinho mais difíceis."
|
||||||
campaign_multiplayer: "Arenas Multijogador"
|
campaign_multiplayer: "Arenas Multijogador"
|
||||||
campaign_multiplayer_description: "... onde programas frente-a-frente contra outros jogadores."
|
campaign_multiplayer_description: "... onde programa frente-a-frente contra outros jogadores."
|
||||||
campaign_player_created: "Criados por Jogadores"
|
campaign_player_created: "Criados por Jogadores"
|
||||||
campaign_player_created_description: "... onde combates contra a criatividade dos teus colegas <a href=\"/contribute#artisan\">Feiticeiros Artesãos</a>."
|
campaign_player_created_description: "... onde combate contra a criatividade dos seus colegas <a href=\"/contribute#artisan\">Feiticeiros Artesãos</a>."
|
||||||
level_difficulty: "Dificuldade: "
|
level_difficulty: "Dificuldade: "
|
||||||
play_as: "Jogar como "
|
play_as: "Jogar Como"
|
||||||
spectate: "Observar"
|
spectate: "Espectar"
|
||||||
|
|
||||||
contact:
|
contact:
|
||||||
contact_us: "Contactar o CodeCombat"
|
contact_us: "Contacte o CodeCombat"
|
||||||
welcome: "É bom ter notícias tuas! Usa este formulário para nos enviares um e-mail."
|
welcome: "É bom ter notícias suas! Use este formulário para nos enviar um e-mail. "
|
||||||
contribute_prefix: "Se estás interessado em contribuir, dá uma olhadela à nossa "
|
contribute_prefix: "Se está interessado em contribuir, dê uma olhadela à nossa "
|
||||||
contribute_page: "página de contribuição"
|
contribute_page: "página de contribuição"
|
||||||
contribute_suffix: "!"
|
contribute_suffix: "!"
|
||||||
forum_prefix: "Para algo público, por favor, usa o "
|
forum_prefix: "Para algo público, por favor use o "
|
||||||
forum_page: "nosso fórum"
|
forum_page: "nosso fórum"
|
||||||
forum_suffix: " como alternativa."
|
forum_suffix: " como alternativa."
|
||||||
send: "Enviar Feedback"
|
send: "Enviar Feedback"
|
||||||
|
@ -132,71 +132,71 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P
|
||||||
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns."
|
# recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 15% of first-year salary. The fee is due upon hiring the employee and is refundable for 90 days if the employee does not remain employed. Part time, remote, and contract employees are free, as are interns."
|
||||||
|
|
||||||
diplomat_suggestion:
|
diplomat_suggestion:
|
||||||
title: "Ajuda a traduzir o CodeCombat!"
|
title: "Ajude a traduzir o CodeCombat!"
|
||||||
sub_heading: "Precisamos das tuas habilidades linguísticas."
|
sub_heading: "Precisamos das suas habilidades linguísticas."
|
||||||
pitch_body: "Desenvolvemos o CodeCombat em Inglês, mas já temos jogadores em todo o mundo. Muitos deles querem jogar em Português e não falam Inglês, por isso, se sabes falar ambas, por favor considera registares-te como Diplomata para ajudares a traduzir o website do CodeCombat e todos os níveis para Português."
|
pitch_body: "Desenvolvemos o CodeCombat em Inglês, mas já temos jogadores em todo o mundo. Muitos deles querem jogar em Português e não falam Inglês, por isso, se sabe falar ambas, por favor considere registar-se como Diplomata para ajudar a traduzir o website do CodeCombat e todos os níveis para Português."
|
||||||
missing_translations: "Enquanto não conseguimos traduzir tudo para Português, irás ver em Inglês o que não estiver disponível em Português."
|
missing_translations: "Enquanto não conseguirmos traduzir tudo para Português, irá ver em Inglês o que não estiver disponível em Português."
|
||||||
learn_more: "Sabe mais sobre ser um Diplomata"
|
learn_more: "Saiba mais sobre ser um Diplomata"
|
||||||
subscribe_as_diplomat: "Subscrever como Diplomata"
|
subscribe_as_diplomat: "Subscreva-se como Diplomata"
|
||||||
|
|
||||||
wizard_settings:
|
wizard_settings:
|
||||||
title: "Definições do Wizard"
|
title: "Definições do Feiticeiro"
|
||||||
customize_avatar: "Altera o teu Avatar"
|
customize_avatar: "Personalize o Seu Avatar"
|
||||||
# active: "Active"
|
active: "Ativo"
|
||||||
# color: "Color"
|
color: "Cor"
|
||||||
# group: "Group"
|
group: "Grupo"
|
||||||
clothes: "Roupas"
|
clothes: "Roupas"
|
||||||
trim: "Pormenores"
|
trim: "Pormenores"
|
||||||
cloud: "Nuvem"
|
cloud: "Nuvem"
|
||||||
# team: "Team"
|
team: "Equipa"
|
||||||
spell: "Feitiço"
|
spell: "Feitiço"
|
||||||
boots: "Botas"
|
boots: "Botas"
|
||||||
hue: "Matiz"
|
hue: "Tom"
|
||||||
saturation: "Saturação"
|
saturation: "Saturação"
|
||||||
lightness: "Brilho"
|
lightness: "Brilho"
|
||||||
|
|
||||||
account_settings:
|
account_settings:
|
||||||
title: "Definições da Conta"
|
title: "Definições da Conta"
|
||||||
not_logged_in: "Inicia sessão ou cria uma conta para alterares as tuas definições."
|
not_logged_in: "Inicie sessão ou crie uma conta para alterar as suas definições."
|
||||||
autosave: "As alterações guardam-se automaticamente"
|
autosave: "Alterações Guardam Automaticamente"
|
||||||
me_tab: "Eu"
|
me_tab: "Eu"
|
||||||
picture_tab: "Fotografia"
|
picture_tab: "Fotografia"
|
||||||
# upload_picture: "Upload a picture"
|
upload_picture: "Anexar uma fotografia"
|
||||||
wizard_tab: "Feiticeiro"
|
wizard_tab: "Feiticeiro"
|
||||||
password_tab: "Palavra-passe"
|
password_tab: "Palavra-passe"
|
||||||
emails_tab: "E-mails"
|
emails_tab: "E-mails"
|
||||||
admin: "Admin"
|
admin: "Administrador"
|
||||||
wizard_color: "Cor das roupas do feiticeiro"
|
wizard_color: "Cor das Roupas do Feiticeiro"
|
||||||
new_password: "Nova palavra-passe"
|
new_password: "Nova Palavra-passe"
|
||||||
new_password_verify: "Verificar"
|
new_password_verify: "Verificar"
|
||||||
email_subscriptions: "Subscrições de E-mail"
|
email_subscriptions: "Subscrições de E-mail"
|
||||||
email_announcements: "Anúncios"
|
email_announcements: "Anúncios"
|
||||||
email_announcements_description: "Recebe e-mails sobre as últimas novidades e desenvolvimentos no CodeCombat."
|
email_announcements_description: "Receba e-mails sobre as últimas novidades e desenvolvimentos no CodeCombat."
|
||||||
email_notifications: "Notificações"
|
email_notifications: "Notificações"
|
||||||
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
|
# email_notifications_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity."
|
||||||
# email_any_notes: "Any Notifications"
|
email_any_notes: "Quaisquer Notificações"
|
||||||
# email_any_notes_description: "Disable to stop all activity notification emails."
|
email_any_notes_description: "Desative para parar de receber todos os e-mails de notificação de atividade."
|
||||||
# email_recruit_notes: "Job Opportunities"
|
email_recruit_notes: "Oportunidades de Emprego"
|
||||||
# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job."
|
email_recruit_notes_description: "Se joga muito bem, podemos contactá-lo para lhe arranjar um (melhor) emprego."
|
||||||
contributor_emails: "E-mails para Contribuintes"
|
contributor_emails: "Subscrições de E-mail (Contribuintes)"
|
||||||
contribute_prefix: "Estamos à procura de pessoas para se juntarem a nós! Visita a "
|
contribute_prefix: "Estamos à procura de pessoas para se juntarem a nós! Visita a "
|
||||||
contribute_page: "página de contribuição"
|
contribute_page: "página de contribuição"
|
||||||
contribute_suffix: " para mais informação."
|
contribute_suffix: " para mais informações."
|
||||||
email_toggle: "Alternar todos"
|
email_toggle: "Alternar Todos"
|
||||||
error_saving: "Erro ao guardar"
|
error_saving: "Erro ao Guardar"
|
||||||
saved: "Alterações guardadas"
|
saved: "Alterações Guardadas"
|
||||||
password_mismatch: "As palavras-passe não coincidem."
|
password_mismatch: "As palavras-passe não coincidem."
|
||||||
# job_profile: "Job Profile"
|
job_profile: "Perfil de Emprego"
|
||||||
# job_profile_approved: "Your job profile has been approved by CodeCombat. Employers will be able to see it until you either mark it inactive or it has not been changed for four weeks."
|
job_profile_approved: "O seu perfil de emprego foi aprovado pelo CodeCombat. Os empregadores poderão vê-lo até que o defina como inativo ou não o tenha alterado à 4 semanas."
|
||||||
# job_profile_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job."
|
job_profile_explanation: "Olá! Preencha isto e entraremos em contacto consigo sobre encontrar um emprego de desenvolvedor de software para si."
|
||||||
# sample_profile: "See a sample profile"
|
sample_profile: "Veja um exemplo de perfil"
|
||||||
# view_profile: "View Your Profile"
|
view_profile: "Veja o Seu Perfil"
|
||||||
|
|
||||||
account_profile:
|
account_profile:
|
||||||
# settings: "Settings"
|
settings: "Definições"
|
||||||
# edit_profile: "Edit Profile"
|
edit_profile: "Editar Perfil"
|
||||||
# done_editing: "Done Editing"
|
done_editing: "Concluir a Edição"
|
||||||
profile_for_prefix: "Perfil de "
|
profile_for_prefix: "Perfil para "
|
||||||
profile_for_suffix: ""
|
profile_for_suffix: ""
|
||||||
# featured: "Featured"
|
# featured: "Featured"
|
||||||
# not_featured: "Not Featured"
|
# not_featured: "Not Featured"
|
||||||
|
@ -282,6 +282,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P
|
||||||
# education_description: "Description"
|
# education_description: "Description"
|
||||||
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
|
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
|
||||||
# our_notes: "Our Notes"
|
# our_notes: "Our Notes"
|
||||||
|
# remarks: "Remarks"
|
||||||
# projects: "Projects"
|
# projects: "Projects"
|
||||||
# projects_header: "Add 3 projects"
|
# projects_header: "Add 3 projects"
|
||||||
# projects_header_2: "Projects (Top 3)"
|
# projects_header_2: "Projects (Top 3)"
|
||||||
|
@ -296,33 +297,38 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P
|
||||||
# project_link_help: "Link to the project."
|
# project_link_help: "Link to the project."
|
||||||
# player_code: "Player Code"
|
# player_code: "Player Code"
|
||||||
|
|
||||||
# employers:
|
employers:
|
||||||
# want_to_hire_our_players: "Hire CodeCombat Players"
|
want_to_hire_our_players: "Contratar Jogadores do CodeCombat"
|
||||||
# what: "What is CodeCombat?"
|
what: "O Que é o CodeCombat?"
|
||||||
# what_blurb: "CodeCombat is a multiplayer browser programming game. Players write code to control their forces in battle against other developers. We support JavaScript, Python, Lua, Clojure, CoffeeScript, and Io."
|
# what_blurb: "CodeCombat is a multiplayer browser programming game. Players write code to control their forces in battle against other developers. We support JavaScript, Python, Lua, Clojure, CoffeeScript, and Io."
|
||||||
# who: "Who Are the Players?"
|
who: "Quem São os Jogadores?"
|
||||||
# who_blurb: "CodeCombateers are software developers who enjoy using their programming skills to play games. They range from college seniors at top 20 engineering programs to 20-year industry veterans."
|
# who_blurb: "CodeCombateers are software developers who enjoy using their programming skills to play games. They range from college seniors at top 20 engineering programs to 20-year industry veterans."
|
||||||
# how: "How Do We Find Developers?"
|
how: "Como Encontramos Desenvolvedores?"
|
||||||
# how_blurb: "We host competitive tournaments to attract competitive software engieneers. We then use in-house algorithms to identify the best players among the top 5% of tournament winners."
|
# how_blurb: "We host competitive tournaments to attract competitive software engieneers. We then use in-house algorithms to identify the best players among the top 5% of tournament winners."
|
||||||
# why: "Why Hire Through Us?"
|
why: "Porquê Contratar Através de Nós?"
|
||||||
# why_blurb_1: "We will save you time. Every CodeCombateer we feaure is "
|
# why_blurb_1: "We will save you time. Every CodeCombateer we feaure is "
|
||||||
|
# cost: "How much do we charge?"
|
||||||
|
# cost_blurb: "We charge 15% of first year's salary and offer a 100% money back guarantee for 90 days. We don't charge for candidates who are already actively being interviewed at your company."
|
||||||
|
# response: "What's the response rate?"
|
||||||
|
# response_blurb: "Almost every developer you contact on CodeCombat will respond to inquires whether or not they want to interivew. If you would like help finding a candidate for your role, we can make recommendations."
|
||||||
# why_blurb_2: "looking for work"
|
# why_blurb_2: "looking for work"
|
||||||
# why_blurb_3: ", has "
|
# why_blurb_3: ", has "
|
||||||
# why_blurb_4: "demonstrated top notch technical skills"
|
# why_blurb_4: "demonstrated top notch technical skills"
|
||||||
# why_blurb_5: ", and has been "
|
# why_blurb_5: ", and has been "
|
||||||
# why_blurb_6: "personally screened by us"
|
# why_blurb_6: "personally screened by us"
|
||||||
# why_blurb_7: ". Stop screening and start hiring."
|
# why_blurb_7: ". Stop screening and start hiring."
|
||||||
# see_candidates: "Click here to see our candidates"
|
see_candidates: "Clique aqui para ver os nossos candidatos"
|
||||||
# candidate_name: "Name"
|
candidate_name: "Nome"
|
||||||
# candidate_location: "Location"
|
candidate_location: "Localização"
|
||||||
# candidate_looking_for: "Looking For"
|
candidate_looking_for: "À Procura de"
|
||||||
# candidate_role: "Role"
|
candidate_role: "Cargo"
|
||||||
# candidate_top_skills: "Top Skills"
|
candidate_top_skills: "Principais Habilidades"
|
||||||
# candidate_years_experience: "Yrs Exp"
|
candidate_years_experience: "Anos de Experiência"
|
||||||
# candidate_last_updated: "Last Updated"
|
candidate_last_updated: "Última Vez Atualizado"
|
||||||
# featured_developers: "Featured Developers"
|
candidate_who: "Quem"
|
||||||
# other_developers: "Other Developers"
|
featured_developers: "Desenvolvedores em Destaque"
|
||||||
# inactive_developers: "Inactive Developers"
|
other_developers: "Outros Desenvolvedores"
|
||||||
|
inactive_developers: "Desenvolvedores Inativos"
|
||||||
|
|
||||||
play_level:
|
play_level:
|
||||||
done: "Concluir"
|
done: "Concluir"
|
||||||
|
|
|
@ -219,8 +219,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
# next_links: "add any personal or social links."
|
# next_links: "add any personal or social links."
|
||||||
# next_photo: "add an optional professional photo."
|
# next_photo: "add an optional professional photo."
|
||||||
# next_active: "mark yourself open to offers to show up in searches."
|
# next_active: "mark yourself open to offers to show up in searches."
|
||||||
# example_blog: "Blog"
|
example_blog: "Блог"
|
||||||
# example_personal_site: "Personal Site"
|
example_personal_site: "Персональный сайт"
|
||||||
# links_header: "Personal Links"
|
# links_header: "Personal Links"
|
||||||
# links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog."
|
# links_blurb: "Link any other sites or profiles you want to highlight, like your GitHub, your LinkedIn, or your blog."
|
||||||
# links_name: "Link Name"
|
# links_name: "Link Name"
|
||||||
|
@ -231,16 +231,16 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
# basics_active_help: "Want interview offers right now?"
|
# basics_active_help: "Want interview offers right now?"
|
||||||
# basics_job_title: "Desired Job Title"
|
# basics_job_title: "Desired Job Title"
|
||||||
# basics_job_title_help: "What role are you looking for?"
|
# basics_job_title_help: "What role are you looking for?"
|
||||||
# basics_city: "City"
|
basics_city: "Город"
|
||||||
# basics_city_help: "City you want to work in (or live in now)."
|
# basics_city_help: "City you want to work in (or live in now)."
|
||||||
# basics_country: "Country"
|
basics_country: "Страна"
|
||||||
# basics_country_help: "Country you want to work in (or live in now)."
|
# basics_country_help: "Country you want to work in (or live in now)."
|
||||||
# basics_visa: "US Work Status"
|
# basics_visa: "US Work Status"
|
||||||
# basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship?"
|
# basics_visa_help: "Are you authorized to work in the US, or do you need visa sponsorship?"
|
||||||
# basics_looking_for: "Looking For"
|
# basics_looking_for: "Looking For"
|
||||||
# basics_looking_for_full_time: "Full-time"
|
basics_looking_for_full_time: "Полная занятость"
|
||||||
# basics_looking_for_part_time: "Part-time"
|
basics_looking_for_part_time: "Частичная занятость"
|
||||||
# basics_looking_for_remote: "Remote"
|
basics_looking_for_remote: "Удаленная работа"
|
||||||
# basics_looking_for_contracting: "Contracting"
|
# basics_looking_for_contracting: "Contracting"
|
||||||
# basics_looking_for_internship: "Internship"
|
# basics_looking_for_internship: "Internship"
|
||||||
# basics_looking_for_help: "What kind of developer position do you want?"
|
# basics_looking_for_help: "What kind of developer position do you want?"
|
||||||
|
@ -264,36 +264,36 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
# work_blurb: "List your relevant work experience, most recent first."
|
# work_blurb: "List your relevant work experience, most recent first."
|
||||||
# work_employer: "Employer"
|
# work_employer: "Employer"
|
||||||
# work_employer_help: "Name of your employer."
|
# work_employer_help: "Name of your employer."
|
||||||
# work_role: "Job Title"
|
work_role: "Должность"
|
||||||
# work_role_help: "What was your job title or role?"
|
# work_role_help: "What was your job title or role?"
|
||||||
# work_duration: "Duration"
|
work_duration: "Продолжительность"
|
||||||
# work_duration_help: "When did you hold this gig?"
|
# work_duration_help: "When did you hold this gig?"
|
||||||
# work_description: "Description"
|
work_description: "Описание"
|
||||||
# work_description_help: "What did you do there? (140 chars; optional)"
|
# work_description_help: "What did you do there? (140 chars; optional)"
|
||||||
education: "Образование"
|
education: "Образование"
|
||||||
# education_header: "Recount your academic ordeals"
|
# education_header: "Recount your academic ordeals"
|
||||||
# education_blurb: "List your academic ordeals."
|
# education_blurb: "List your academic ordeals."
|
||||||
# education_school: "School"
|
# education_school: "School"
|
||||||
# education_school_help: "Name of your school."
|
# education_school_help: "Name of your school."
|
||||||
# education_degree: "Degree"
|
education_degree: "Степень"
|
||||||
# education_degree_help: "What was your degree and field of study?"
|
# education_degree_help: "What was your degree and field of study?"
|
||||||
# education_duration: "Dates"
|
# education_duration: "Dates"
|
||||||
# education_duration_help: "When?"
|
# education_duration_help: "When?"
|
||||||
# education_description: "Description"
|
education_description: "Описание"
|
||||||
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
|
# education_description_help: "Highlight anything about this educational experience. (140 chars; optional)"
|
||||||
our_notes: "Наши заметки"
|
our_notes: "Наши заметки"
|
||||||
projects: "Проекты"
|
projects: "Проекты"
|
||||||
# projects_header: "Add 3 projects"
|
projects_header: "Добавьте 3 проекта"
|
||||||
# projects_header_2: "Projects (Top 3)"
|
projects_header_2: "Проекты (3 самых лучших)"
|
||||||
# projects_blurb: "Highlight your projects to amaze employers."
|
# projects_blurb: "Highlight your projects to amaze employers."
|
||||||
# project_name: "Project Name"
|
project_name: "Название проекта"
|
||||||
# project_name_help: "What was the project called?"
|
# project_name_help: "What was the project called?"
|
||||||
# project_description: "Description"
|
project_description: "Описание"
|
||||||
# project_description_help: "Briefly describe the project."
|
# project_description_help: "Briefly describe the project."
|
||||||
# project_picture: "Picture"
|
# project_picture: "Picture"
|
||||||
# project_picture_help: "Upload a 230x115px or larger image showing off the project."
|
# project_picture_help: "Upload a 230x115px or larger image showing off the project."
|
||||||
# project_link: "Link"
|
project_link: "Ссылка"
|
||||||
# project_link_help: "Link to the project."
|
project_link_help: "Ссылка на проект."
|
||||||
# player_code: "Player Code"
|
# player_code: "Player Code"
|
||||||
|
|
||||||
employers:
|
employers:
|
||||||
|
@ -302,7 +302,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
# what_blurb: "CodeCombat is a multiplayer browser programming game. Players write code to control their forces in battle against other developers. We support JavaScript, Python, Lua, Clojure, CoffeeScript, and Io."
|
# what_blurb: "CodeCombat is a multiplayer browser programming game. Players write code to control their forces in battle against other developers. We support JavaScript, Python, Lua, Clojure, CoffeeScript, and Io."
|
||||||
# who: "Who Are the Players?"
|
# who: "Who Are the Players?"
|
||||||
# who_blurb: "CodeCombateers are software developers who enjoy using their programming skills to play games. They range from college seniors at top 20 engineering programs to 20-year industry veterans."
|
# who_blurb: "CodeCombateers are software developers who enjoy using their programming skills to play games. They range from college seniors at top 20 engineering programs to 20-year industry veterans."
|
||||||
# how: "How Do We Find Developers?"
|
how: "Как мы находим разработчиков?"
|
||||||
# how_blurb: "We host competitive tournaments to attract competitive software engieneers. We then use in-house algorithms to identify the best players among the top 5% of tournament winners."
|
# how_blurb: "We host competitive tournaments to attract competitive software engieneers. We then use in-house algorithms to identify the best players among the top 5% of tournament winners."
|
||||||
# why: "Why Hire Through Us?"
|
# why: "Why Hire Through Us?"
|
||||||
# why_blurb_1: "We will save you time. Every CodeCombateer we feaure is "
|
# why_blurb_1: "We will save you time. Every CodeCombateer we feaure is "
|
||||||
|
@ -433,12 +433,12 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
cast_spell: "Произнести текущее заклинание."
|
cast_spell: "Произнести текущее заклинание."
|
||||||
# continue_script: "Continue past current script."
|
# continue_script: "Continue past current script."
|
||||||
# skip_scripts: "Skip past all skippable scripts."
|
# skip_scripts: "Skip past all skippable scripts."
|
||||||
# toggle_playback: "Toggle play/pause."
|
toggle_playback: "Переключить проигрывание/паузу."
|
||||||
# scrub_playback: "Scrub back and forward through time."
|
scrub_playback: "Перемотка назад и вперед во времени."
|
||||||
# single_scrub_playback: "Scrub back and forward through time by a single frame."
|
# single_scrub_playback: "Scrub back and forward through time by a single frame."
|
||||||
# scrub_execution: "Scrub through current spell execution."
|
# scrub_execution: "Scrub through current spell execution."
|
||||||
# toggle_debug: "Toggle debug display."
|
toggle_debug: "Включить отображение отладки."
|
||||||
# toggle_grid: "Toggle grid overlay."
|
toggle_grid: "Включить наложение сетки."
|
||||||
# toggle_pathfinding: "Toggle pathfinding overlay."
|
# toggle_pathfinding: "Toggle pathfinding overlay."
|
||||||
# beautify: "Beautify your code by standardizing its formatting."
|
# beautify: "Beautify your code by standardizing its formatting."
|
||||||
# move_wizard: "Move your Wizard around the level."
|
# move_wizard: "Move your Wizard around the level."
|
||||||
|
@ -448,7 +448,7 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
av_entities_sub_title: "Сущности"
|
av_entities_sub_title: "Сущности"
|
||||||
av_entities_users_url: "Пользователи"
|
av_entities_users_url: "Пользователи"
|
||||||
av_entities_active_instances_url: "Активные экземпляры"
|
av_entities_active_instances_url: "Активные экземпляры"
|
||||||
# av_entities_employer_list_url: "Employer List"
|
av_entities_employer_list_url: "Список работодателей"
|
||||||
av_other_sub_title: "Другое"
|
av_other_sub_title: "Другое"
|
||||||
av_other_debug_base_url: "База (для отладки base.jade)"
|
av_other_debug_base_url: "База (для отладки base.jade)"
|
||||||
u_title: "Список пользователей"
|
u_title: "Список пользователей"
|
||||||
|
@ -514,9 +514,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
new_article_title: "Создать новую статью"
|
new_article_title: "Создать новую статью"
|
||||||
new_thang_title: "Создать новый тип объектов"
|
new_thang_title: "Создать новый тип объектов"
|
||||||
new_level_title: "Создать новый уровень"
|
new_level_title: "Создать новый уровень"
|
||||||
# new_article_title_login: "Log In to Create a New Article"
|
new_article_title_login: "Войти, чтобы создать новую статью"
|
||||||
# new_thang_title_login: "Log In to Create a New Thang Type"
|
# new_thang_title_login: "Log In to Create a New Thang Type"
|
||||||
# new_level_title_login: "Log In to Create a New Level"
|
new_level_title_login: "Войти чтобы создать новый уровень"
|
||||||
# new_achievement_title: "Create a New Achievement"
|
# new_achievement_title: "Create a New Achievement"
|
||||||
# new_achievement_title_login: "Log In to Create a New Achievement"
|
# new_achievement_title_login: "Log In to Create a New Achievement"
|
||||||
article_search_title: "Искать статьи"
|
article_search_title: "Искать статьи"
|
||||||
|
@ -815,8 +815,8 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
# prizes: "Prizes"
|
# prizes: "Prizes"
|
||||||
# total_value: "Total Value"
|
# total_value: "Total Value"
|
||||||
# in_cash: "in cash"
|
# in_cash: "in cash"
|
||||||
# custom_wizard: "Custom CodeCombat Wizard"
|
custom_wizard: "Изменить волшебника CodeCombat"
|
||||||
# custom_avatar: "Custom CodeCombat avatar"
|
custom_avatar: "Изменить аватар CodeCombat"
|
||||||
# heap: "for six months of \"Startup\" access"
|
# heap: "for six months of \"Startup\" access"
|
||||||
# credits: "credits"
|
# credits: "credits"
|
||||||
# one_month_coupon: "coupon: choose either Rails or HTML"
|
# one_month_coupon: "coupon: choose either Rails or HTML"
|
||||||
|
@ -871,9 +871,9 @@ module.exports = nativeDescription: "русский", englishDescription: "Russi
|
||||||
components: "Компоненты"
|
components: "Компоненты"
|
||||||
# thang: "Thang"
|
# thang: "Thang"
|
||||||
# thangs: "Thangs"
|
# thangs: "Thangs"
|
||||||
# level_session: "Your Session"
|
level_session: "Ваша сессия"
|
||||||
# opponent_session: "Opponent Session"
|
# opponent_session: "Opponent Session"
|
||||||
# article: "Article"
|
article: "Статья"
|
||||||
# user_names: "User Names"
|
# user_names: "User Names"
|
||||||
# thang_names: "Thang Names"
|
# thang_names: "Thang Names"
|
||||||
files: "Файлы"
|
files: "Файлы"
|
||||||
|
|
|
@ -21,14 +21,14 @@ module.exports = class User extends CocoModel
|
||||||
lang: ->
|
lang: ->
|
||||||
@get('preferredLanguage') or 'en-US'
|
@get('preferredLanguage') or 'en-US'
|
||||||
|
|
||||||
getPhotoURL: (size=80, useJobProfilePhoto=false) ->
|
getPhotoURL: (size=80, useJobProfilePhoto=false, useEmployerPageAvatar=false) ->
|
||||||
photoURL = if useJobProfilePhoto then @get('jobProfile')?.photoURL else null
|
photoURL = if useJobProfilePhoto then @get('jobProfile')?.photoURL else null
|
||||||
photoURL ||= @get('photoURL')
|
photoURL ||= @get('photoURL')
|
||||||
if photoURL
|
if photoURL
|
||||||
prefix = if photoURL.search(/\?/) is -1 then '?' else '&'
|
prefix = if photoURL.search(/\?/) is -1 then '?' else '&'
|
||||||
return "#{photoURL}#{prefix}s=#{size}" if photoURL.search('http') isnt -1 # legacy
|
return "#{photoURL}#{prefix}s=#{size}" if photoURL.search('http') isnt -1 # legacy
|
||||||
return "/file/#{photoURL}#{prefix}s=#{size}"
|
return "/file/#{photoURL}#{prefix}s=#{size}"
|
||||||
return "/db/user/#{@id}/avatar?s=#{size}"
|
return "/db/user/#{@id}/avatar?s=#{size}&employerPageAvatar=#{useEmployerPageAvatar}"
|
||||||
|
|
||||||
@getByID = (id, properties, force) ->
|
@getByID = (id, properties, force) ->
|
||||||
{me} = require 'lib/auth'
|
{me} = require 'lib/auth'
|
||||||
|
|
|
@ -33,6 +33,7 @@ PropertyDocumentationSchema = c.object {
|
||||||
title: 'Language Descriptions',
|
title: 'Language Descriptions',
|
||||||
description: 'Property descriptions by code language.',
|
description: 'Property descriptions by code language.',
|
||||||
additionalProperties: {type: 'string', description: 'Description of the property.', maxLength: 1000, format: 'markdown'}
|
additionalProperties: {type: 'string', description: 'Description of the property.', maxLength: 1000, format: 'markdown'}
|
||||||
|
format: 'code-languages-object'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
args: c.array {title: 'Arguments', description: 'If this property has type "function", then provide documentation for any function arguments.'}, c.FunctionArgumentSchema
|
args: c.array {title: 'Arguments', description: 'If this property has type "function", then provide documentation for any function arguments.'}, c.FunctionArgumentSchema
|
||||||
|
@ -44,19 +45,11 @@ PropertyDocumentationSchema = c.object {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
title: 'Language Examples',
|
title: 'Language Examples',
|
||||||
description: 'Examples by code language.',
|
description: 'Examples by code language.',
|
||||||
additionalProperties: {type: 'string', description: 'An example code block.', format: 'javascript'} # TODO: not JS
|
additionalProperties: {type: 'string', description: 'An example code block.', format: 'code'}
|
||||||
|
format: 'code-languages-object'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
snippets: c.object {
|
snippets: {type: 'object', title: 'Snippets', description: 'List of snippets for the respective programming languages', additionalProperties: c.codeSnippet, format: 'code-languages-object'}
|
||||||
title: 'Snippets',
|
|
||||||
description: 'List of snippets for the respective programming languages'
|
|
||||||
},
|
|
||||||
javascript: c.object {title: 'JavaScript'}, c.codeSnippet 'javascript'
|
|
||||||
coffeescript: c.object {title: 'CoffeeScript'}, c.codeSnippet 'coffee'
|
|
||||||
python: c.object {title: 'Python'}, c.codeSnippet 'python'
|
|
||||||
clojure: c.object {title: 'Clojure'}, c.codeSnippet 'clojure'
|
|
||||||
lua: c.object {title: 'Lua'}, c.codeSnippet 'lua'
|
|
||||||
io: c.object {title: 'IO'}, c.codeSnippet 'io'
|
|
||||||
returns: c.object {
|
returns: c.object {
|
||||||
title: 'Return Value'
|
title: 'Return Value'
|
||||||
description: 'Optional documentation of any return value.'
|
description: 'Optional documentation of any return value.'
|
||||||
|
@ -71,7 +64,8 @@ PropertyDocumentationSchema = c.object {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
title: 'Language Examples',
|
title: 'Language Examples',
|
||||||
description: 'Example return values by code language.',
|
description: 'Example return values by code language.',
|
||||||
additionalProperties: c.shortString(description: 'Example return value.', format: 'javascript') # TODO: not JS
|
additionalProperties: c.shortString(description: 'Example return value.', format: 'code')
|
||||||
|
format: 'code-languages-object'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
description:
|
description:
|
||||||
|
@ -82,6 +76,7 @@ PropertyDocumentationSchema = c.object {
|
||||||
title: 'Language Descriptions',
|
title: 'Language Descriptions',
|
||||||
description: 'Example return values by code language.',
|
description: 'Example return values by code language.',
|
||||||
additionalProperties: {type: 'string', description: 'Description of the return value.', maxLength: 1000}
|
additionalProperties: {type: 'string', description: 'Description of the return value.', maxLength: 1000}
|
||||||
|
format: 'code-languages-object'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ UserSchema = c.object {},
|
||||||
experience: {type: 'integer', title: 'Years of Experience', minimum: 0, description: 'How many years of professional experience (getting paid) developing software do you have?'}
|
experience: {type: 'integer', title: 'Years of Experience', minimum: 0, description: 'How many years of professional experience (getting paid) developing software do you have?'}
|
||||||
shortDescription: {type: 'string', maxLength: 140, title: 'Short Description', description: 'Who are you, and what are you looking for? 140 characters max.', default: 'Programmer seeking to build great software.'}
|
shortDescription: {type: 'string', maxLength: 140, title: 'Short Description', description: 'Who are you, and what are you looking for? 140 characters max.', default: 'Programmer seeking to build great software.'}
|
||||||
longDescription: {type: 'string', maxLength: 600, title: 'Description', description: 'Describe yourself to potential employers. Keep it short and to the point. We recommend outlining the position that would most interest you. Tasteful markdown okay; 600 characters max.', format: 'markdown', default: '* I write great code.\n* You need great code?\n* Great!'}
|
longDescription: {type: 'string', maxLength: 600, title: 'Description', description: 'Describe yourself to potential employers. Keep it short and to the point. We recommend outlining the position that would most interest you. Tasteful markdown okay; 600 characters max.', format: 'markdown', default: '* I write great code.\n* You need great code?\n* Great!'}
|
||||||
visa: c.shortString {title: 'US Work Status', description: 'Are you authorized to work in the US, or do you need visa sponsorship?', enum: ['Authorized to work in the US', 'Need visa sponsorship'], default: 'Authorized to work in the US'}
|
visa: c.shortString {title: 'US Work Status', description: 'Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.)', enum: ['Authorized to work in the US', 'Need visa sponsorship'], default: 'Authorized to work in the US'}
|
||||||
work: c.array {title: 'Work Experience', description: 'List your relevant work experience, most recent first.'},
|
work: c.array {title: 'Work Experience', description: 'List your relevant work experience, most recent first.'},
|
||||||
c.object {title: 'Job', description: 'Some work experience you had.', required: ['employer', 'role', 'duration']},
|
c.object {title: 'Job', description: 'Some work experience you had.', required: ['employer', 'role', 'duration']},
|
||||||
employer: c.shortString {title: 'Employer', description: 'Name of your employer.'}
|
employer: c.shortString {title: 'Employer', description: 'Name of your employer.'}
|
||||||
|
@ -134,7 +134,7 @@ UserSchema = c.object {},
|
||||||
schoolFilter:
|
schoolFilter:
|
||||||
title: 'School'
|
title: 'School'
|
||||||
type: 'string'
|
type: 'string'
|
||||||
enum: ['Top 20 Eng.', 'Other US', 'Other Intl.']
|
enum: ['Top School', 'Other']
|
||||||
locationFilter:
|
locationFilter:
|
||||||
title: 'Location'
|
title: 'Location'
|
||||||
type: 'string'
|
type: 'string'
|
||||||
|
@ -142,11 +142,15 @@ UserSchema = c.object {},
|
||||||
roleFilter:
|
roleFilter:
|
||||||
title: 'Role'
|
title: 'Role'
|
||||||
type: 'string'
|
type: 'string'
|
||||||
enum: ['Web Developer', 'Software Developer', 'iOS Developer', 'Android Developer', 'Project Manager']
|
enum: ['Web Developer', 'Software Developer', 'Mobile Developer']
|
||||||
seniorityFilter:
|
seniorityFilter:
|
||||||
title: 'Seniority'
|
title: 'Seniority'
|
||||||
type: 'string'
|
type: 'string'
|
||||||
enum: ['College Student', 'Recent Grad', 'Junior', 'Senior', 'Management']
|
enum: ['College Student', 'Recent Grad', 'Junior', 'Senior']
|
||||||
|
featured:
|
||||||
|
title: 'Featured'
|
||||||
|
type: 'boolean'
|
||||||
|
description: 'Should this candidate be prominently featured on the site?'
|
||||||
jobProfileApproved: {title: 'Job Profile Approved', type: 'boolean', description: 'Whether your profile has been approved by CodeCombat.'}
|
jobProfileApproved: {title: 'Job Profile Approved', type: 'boolean', description: 'Whether your profile has been approved by CodeCombat.'}
|
||||||
jobProfileNotes: {type: 'string', maxLength: 1000, title: 'Our Notes', description: 'CodeCombat\'s notes on the candidate.', format: 'markdown', default: ''}
|
jobProfileNotes: {type: 'string', maxLength: 1000, title: 'Our Notes', description: 'CodeCombat\'s notes on the candidate.', format: 'markdown', default: ''}
|
||||||
employerAt: c.shortString {description: 'If given employer permissions to view job candidates, for which employer?'}
|
employerAt: c.shortString {description: 'If given employer permissions to view job candidates, for which employer?'}
|
||||||
|
|
|
@ -186,11 +186,9 @@ me.FunctionArgumentSchema = me.object {
|
||||||
description: 'Default value of the argument. (Your code should set this.)'
|
description: 'Default value of the argument. (Your code should set this.)'
|
||||||
'default': null
|
'default': null
|
||||||
|
|
||||||
me.codeSnippet = (mode) ->
|
me.codeSnippet =
|
||||||
return snippet =
|
code: {type: 'string', title: 'Snippet', default: '', description: 'Code snippet. Use ${1:defaultValue} syntax to add flexible arguments'}
|
||||||
code: {type: 'string', title: 'Snippet', default: '', description: 'Code snippet. Use ${1:defaultValue} syntax to add flexible arguments'}
|
tab: {type: 'string', title: 'Tab Trigger', description: 'Tab completion text. Will be expanded to the snippet if typed and hit tab.'}
|
||||||
# code: {type: 'string', format: 'ace', aceMode: 'ace/mode/'+mode, title: 'Snippet', default: '', description: 'Code snippet. Use ${1:defaultValue} syntax to add flexible arguments'}
|
|
||||||
tab: {type: 'string', title: 'Tab Trigger', description: 'Tab completion text. Will be expanded to the snippet if typed and hit tab.'}
|
|
||||||
|
|
||||||
me.activity = me.object {description: 'Stats on an activity'},
|
me.activity = me.object {description: 'Stats on an activity'},
|
||||||
first: me.date()
|
first: me.date()
|
||||||
|
|
|
@ -8,9 +8,13 @@
|
||||||
width: 450px
|
width: 450px
|
||||||
margin: 0 auto
|
margin: 0 auto
|
||||||
|
|
||||||
|
label
|
||||||
|
cursor: pointer
|
||||||
|
|
||||||
#color-settings table
|
#color-settings table
|
||||||
float: left
|
float: left
|
||||||
width: 250px
|
width: 250px
|
||||||
|
cursor: pointer
|
||||||
|
|
||||||
.minicolors-input
|
.minicolors-input
|
||||||
display: none
|
display: none
|
||||||
|
|
|
@ -1,6 +1,15 @@
|
||||||
#employers-view
|
#employers-view
|
||||||
|
.artisanal-claim
|
||||||
|
font-variant: small-caps
|
||||||
|
text-align: center
|
||||||
|
font-size: 20px
|
||||||
|
font-weight: bold
|
||||||
|
font-family: Copperplate, "Copperplate Gothic Light", fantasy
|
||||||
|
border-top: 1px solid #DBDBDB
|
||||||
|
border-bottom: 1px solid #DBDBDB
|
||||||
|
margin-bottom: 5px
|
||||||
|
|
||||||
button
|
.employer-button
|
||||||
background: #fce232 /* Old browsers */
|
background: #fce232 /* Old browsers */
|
||||||
background: -moz-linear-gradient(top, #fce232 0%, #ea8e2b 100%)
|
background: -moz-linear-gradient(top, #fce232 0%, #ea8e2b 100%)
|
||||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fce232), color-stop(100%,#ea8e2b))
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fce232), color-stop(100%,#ea8e2b))
|
||||||
|
@ -14,18 +23,42 @@
|
||||||
|
|
||||||
//filter panels
|
//filter panels
|
||||||
#filter
|
#filter
|
||||||
|
border: 2px solid #CBCBCB
|
||||||
margin-bottom: 10px
|
margin-bottom: 10px
|
||||||
.panel-heading
|
.panel-heading
|
||||||
background-color: darkgrey
|
background-color: #D9D9D9
|
||||||
|
cursor: pointer
|
||||||
|
border-top-left-radius: 0px
|
||||||
|
border-top-right-radius: 0px
|
||||||
|
#folder-icon
|
||||||
|
margin-right: 5px
|
||||||
.panel-body
|
.panel-body
|
||||||
background-color: darkgrey
|
background-color: #D9D9D9
|
||||||
|
border-top-left-radius: 0px
|
||||||
|
border-top-right-radius: 0px
|
||||||
|
.panel
|
||||||
|
border: 1px red
|
||||||
|
border-radius: 0px
|
||||||
|
|
||||||
#filters
|
#filters
|
||||||
|
margin-bottom: 10px
|
||||||
.filter_section
|
.filter_section
|
||||||
width: 16%
|
min-width: 25%
|
||||||
|
margin-right: 10px
|
||||||
display: inline-block
|
display: inline-block
|
||||||
vertical-align: top
|
vertical-align: top
|
||||||
margin-bottom: 10px
|
|
||||||
|
h4
|
||||||
|
margin-bottom: 5px
|
||||||
|
|
||||||
|
label
|
||||||
|
display: block
|
||||||
|
font-weight: normal
|
||||||
|
margin-bottom: 0
|
||||||
|
cursor: pointer
|
||||||
|
input
|
||||||
|
margin-right: 5px
|
||||||
|
|
||||||
.get-started-button
|
.get-started-button
|
||||||
vertical-align: text-bottom
|
vertical-align: text-bottom
|
||||||
margin-left: 10px
|
margin-left: 10px
|
||||||
|
@ -33,13 +66,13 @@
|
||||||
#filter-button, #create-alert-button
|
#filter-button, #create-alert-button
|
||||||
float: right
|
float: right
|
||||||
|
|
||||||
#login-link, #logout-button
|
#login-link, #logout-link
|
||||||
float: right
|
float: right
|
||||||
color: #333333
|
color: #333333
|
||||||
display: inline-block
|
display: inline-block
|
||||||
:visited
|
:visited
|
||||||
color: #333333
|
color: #333333
|
||||||
#logout-button:hover
|
#logout-link:hover
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
|
|
||||||
#tagline, .hiring-call-to-action
|
#tagline, .hiring-call-to-action
|
||||||
|
@ -73,7 +106,6 @@
|
||||||
height: 150px
|
height: 150px
|
||||||
padding-right: 15px
|
padding-right: 15px
|
||||||
|
|
||||||
|
|
||||||
.reason
|
.reason
|
||||||
width: 33%
|
width: 33%
|
||||||
padding-left: 3%
|
padding-left: 3%
|
||||||
|
@ -99,9 +131,6 @@
|
||||||
#bottom_row
|
#bottom_row
|
||||||
height: auto
|
height: auto
|
||||||
#candidate-table
|
#candidate-table
|
||||||
width: 96%
|
|
||||||
margin-left: 2%
|
|
||||||
margin-right: 2%
|
|
||||||
background-color: #E7E7E7
|
background-color: #E7E7E7
|
||||||
table
|
table
|
||||||
cursor: pointer
|
cursor: pointer
|
||||||
|
@ -109,38 +138,48 @@
|
||||||
margin-left: 2%
|
margin-left: 2%
|
||||||
margin-right: 2%
|
margin-right: 2%
|
||||||
margin-bottom: 30px
|
margin-bottom: 30px
|
||||||
.tag_column
|
.tag_column, .location_column, .education_column, .work_column
|
||||||
width: 25%
|
width: 33%
|
||||||
display: inline-block
|
display: inline-block
|
||||||
.location_column
|
img
|
||||||
display: inline-block
|
margin-right: 5px
|
||||||
width: 25%
|
vertical-align: top
|
||||||
.education_column
|
|
||||||
display: inline-block
|
|
||||||
width: 25%
|
|
||||||
.work_column
|
|
||||||
display: inline-block
|
|
||||||
width: 25%
|
|
||||||
tr
|
tr
|
||||||
.candidate-picture
|
.candidate-picture
|
||||||
width: 50px
|
width: 100px
|
||||||
height: 50px
|
height: 100px
|
||||||
border-radius: 5px
|
border-radius: 5px
|
||||||
overflow: hidden
|
overflow: hidden
|
||||||
margin-right: 10px
|
margin-right: 10px
|
||||||
|
img
|
||||||
|
border-radius: 5px
|
||||||
|
|
||||||
.candidate-description
|
.candidate-description
|
||||||
width: 100%
|
width: 100%
|
||||||
vertical-align: bottom
|
vertical-align: bottom
|
||||||
td
|
td.candidate-description
|
||||||
margin-bottom: 10px
|
|
||||||
margin-top: 10px
|
|
||||||
padding-bottom: 5px
|
padding-bottom: 5px
|
||||||
padding-top: 10px
|
td.candidate-name-cell
|
||||||
|
padding-top: 15px
|
||||||
|
padding-bottom: 5px
|
||||||
|
font-size: 18px
|
||||||
|
|
||||||
.border_row
|
.border_row
|
||||||
border-bottom: 1px solid #d3d3d3
|
border-bottom: 1px solid #d3d3d3
|
||||||
vertical-align: bottom
|
vertical-align: bottom
|
||||||
padding-top: 0px
|
td
|
||||||
|
padding-top: 5px
|
||||||
|
padding-bottom: 15px
|
||||||
|
|
||||||
|
.teaser-profiles #candidate-table table
|
||||||
|
.tag_column, .location_column, .education_column, .work_column
|
||||||
|
width: 25%
|
||||||
|
tr
|
||||||
|
.candidate-description
|
||||||
|
padding-top: 15px
|
||||||
|
.candidate-picture
|
||||||
|
width: 50px
|
||||||
|
height: 50px
|
||||||
|
|
||||||
#results
|
#results
|
||||||
display: inline-block
|
display: inline-block
|
||||||
|
|
|
@ -18,4 +18,38 @@
|
||||||
|
|
||||||
|
|
||||||
#employer-content-area
|
#employer-content-area
|
||||||
margin: auto
|
margin: auto
|
||||||
|
|
||||||
|
.employer-modal-background-wrapper
|
||||||
|
background-color: white
|
||||||
|
border: 2px #333333 solid
|
||||||
|
border-radius: 4px
|
||||||
|
h1, h2, h3, h4, h5
|
||||||
|
color: black
|
||||||
|
font-family: Arial, Helvetica, sans-serif
|
||||||
|
.input-large
|
||||||
|
font-size: 28px
|
||||||
|
height: 60px
|
||||||
|
border: 2px rgb(231,231,231) solid
|
||||||
|
box-shadow: none
|
||||||
|
width: 70%
|
||||||
|
margin-left: 15%
|
||||||
|
#create-account-button, #contract-agreement-button, #login-button
|
||||||
|
background: #fce232 /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #fce232 0%, #ea8e2b 100%)
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fce232), color-stop(100%,#ea8e2b))
|
||||||
|
background: -webkit-linear-gradient(top, #fce232 0%,#ea8e2b 100%)
|
||||||
|
background: -o-linear-gradient(top, #fce232 0%,#ea8e2b 100%)
|
||||||
|
background: -ms-linear-gradient(top, #fce232 0%,#ea8e2b 100%)
|
||||||
|
background: linear-gradient(to bottom, #fce232 0%,#ea8e2b 100%)
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fce232', endColorstr='#ea8e2b',GradientType=0 )
|
||||||
|
height: 60px
|
||||||
|
font-size: 24px
|
||||||
|
color: black
|
||||||
|
.login-link
|
||||||
|
text-decoration: underline
|
||||||
|
#login-button
|
||||||
|
margin-left: 40%
|
||||||
|
width: 20%
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,7 @@ block content
|
||||||
select.form-control(name='root[visa]')
|
select.form-control(name='root[visa]')
|
||||||
option(value='Authorized to work in the US', selected=profile.visa == 'Authorized to work in the US') Authorized to work in the US
|
option(value='Authorized to work in the US', selected=profile.visa == 'Authorized to work in the US') Authorized to work in the US
|
||||||
option(value='Need visa sponsorship', selected=profile.visa == 'Need visa sponsorship') Need visa sponsorship
|
option(value='Need visa sponsorship', selected=profile.visa == 'Need visa sponsorship') Need visa sponsorship
|
||||||
p.help-block(data-i18n="account_profile.basics_visa_help") Are you authorized to work in the US, or do you need visa sponsorship?
|
p.help-block(data-i18n="account_profile.basics_visa_help") Are you authorized to work in the US, or do you need visa sponsorship? (If you live in Canada or Australia, mark authorized.)
|
||||||
.form-group
|
.form-group
|
||||||
label.control-label(data-i18n="account_profile.basics_looking_for") Looking For
|
label.control-label(data-i18n="account_profile.basics_looking_for") Looking For
|
||||||
select.form-control(name='root[lookingFor]')
|
select.form-control(name='root[lookingFor]')
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#color-settings
|
#color-settings
|
||||||
table.table.table-bordered
|
table.table.table-bordered.table-hover
|
||||||
tr
|
tr
|
||||||
th(data-i18n="wizard_settings.active") Active
|
th(data-i18n="wizard_settings.active") Active
|
||||||
th(data-i18n="wizard_settings.color") Color
|
th(data-i18n="wizard_settings.color") Color
|
||||||
|
|
|
@ -72,7 +72,7 @@ block content
|
||||||
li Slovak - Anon
|
li Slovak - Anon
|
||||||
li Persian - Reza Habibi (Rehb)
|
li Persian - Reza Habibi (Rehb)
|
||||||
li Czech - vanous
|
li Czech - vanous
|
||||||
li Russian - fess89, ser-storchak, Mr A
|
li Russian - fess89, ser-storchak, Mr A, a1ip
|
||||||
li Ukrainian - fess89
|
li Ukrainian - fess89
|
||||||
li Italian - flauta
|
li Italian - flauta
|
||||||
li Norwegian - bardeh
|
li Norwegian - bardeh
|
||||||
|
|
|
@ -23,6 +23,9 @@ block content
|
||||||
|
|
||||||
#article-view
|
#article-view
|
||||||
|
|
||||||
|
h3 Patches
|
||||||
|
.patches-view
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
div#error-view
|
div#error-view
|
||||||
|
|
|
@ -7,7 +7,10 @@ block modal-body-content
|
||||||
form.form
|
form.form
|
||||||
.form-group
|
.form-group
|
||||||
label(for="level-component-system", data-i18n="editor.new_component_field_system").control-label System
|
label(for="level-component-system", data-i18n="editor.new_component_field_system").control-label System
|
||||||
input.form-control#level-component-system(name="system", type="text")
|
select.form-control#level-component-system(name='system')
|
||||||
|
for system in systems
|
||||||
|
option(value=system)= system
|
||||||
|
//input.form-control#level-component-system(name="system", type="text")
|
||||||
.form-group
|
.form-group
|
||||||
label(for="level-component-name", data-i18n="general.name").control-label Name
|
label(for="level-component-name", data-i18n="general.name").control-label Name
|
||||||
input.form-control#level-component-name(name="name", type="text")
|
input.form-control#level-component-name(name="name", type="text")
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#components-treema.nano-content
|
#components-treema.nano-content
|
||||||
|
|
||||||
.edit-component-container
|
.edit-component-container
|
||||||
if me.isAdmin()
|
if !me.get('anonymous')
|
||||||
button.btn.btn-primary#create-new-component-button-no-select
|
button.btn.btn-primary#create-new-component-button-no-select
|
||||||
span.icon-plus
|
span.icon-plus
|
||||||
span.text(data-i18n="editor.level_component_btn_new") Create New Component
|
span.text(data-i18n="editor.level_component_btn_new") Create New Component
|
||||||
|
|
|
@ -1,146 +1,134 @@
|
||||||
extends /templates/recruitment_base
|
extends /templates/recruitment_base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
|
.artisanal-claim
|
||||||
|
| Always 100% Pre-Screened
|
||||||
if me.get('anonymous')
|
if me.get('anonymous')
|
||||||
a#login-link Login
|
a#login-link Login
|
||||||
br
|
br
|
||||||
if !isEmployer && !me.isAdmin()
|
if !isEmployer && !me.isAdmin()
|
||||||
#tagline
|
#tagline
|
||||||
h1(data-i18n="employers.hire_developers_not_credentials") Hire developers, not credentials.
|
h1(data-i18n="employers.hire_developers_not_credentials") Hire developers, not credentials.
|
||||||
button.btn.get-started-button Get started
|
button.btn.get-started-button.employer-button Get started
|
||||||
else
|
else
|
||||||
if !me.get('anonymous')
|
if !me.get('anonymous')
|
||||||
a#logout-button(data-i18n="login.log_out") Logout
|
a#logout-link(data-i18n="login.log_out") Logout
|
||||||
br
|
br
|
||||||
#filter
|
.row
|
||||||
.panel-group#filter_panel
|
- var fullProfiles = isEmployer || me.isAdmin();
|
||||||
a#filter-link(data-toggle="collapse" data-target="#collapseOne")
|
#candidates-column(class=fullProfiles ? "full-profiles col-md-9" : "teaser-profiles col-md-12")
|
||||||
.panel.panel-default
|
if candidates.length
|
||||||
.panel-heading
|
#candidate-table
|
||||||
h4.panel-title
|
table
|
||||||
|
tbody
|
||||||
span.glyphicon.glyphicon-folder-open#folder-icon
|
for candidate, index in featuredCandidates
|
||||||
| Filter
|
- var profile = candidate.get('jobProfile');
|
||||||
.panel-collapse.collapse.in#collapseOne
|
- var authorized = candidate.id; // If we have the id, then we are authorized.
|
||||||
.panel-body
|
- var profileAge = (new Date() - new Date(profile.updated)) / 86400 / 1000;
|
||||||
form#filters
|
- var expired = profileAge > 2 * 30.4;
|
||||||
.filter_section#screened_filter
|
- var curated = profile.curated;
|
||||||
h4 Screened
|
- var photoSize = fullProfiles ? 100 : 50;
|
||||||
input(type="checkbox" name="phoneScreenFilter" value="true")
|
|
||||||
| Phone Screened
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="phoneScreenFilter" value="false")
|
|
||||||
| Not Phone Screened
|
|
||||||
.filter_section#visa_filter
|
|
||||||
h4 Visa
|
|
||||||
input(type="checkbox" name="visa" value="Authorized to work in the US")
|
|
||||||
| US Authorized
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="visa" value="Need visa sponsorship")
|
|
||||||
| Not Authorized
|
|
||||||
.filter_section#school_filter
|
|
||||||
h4 School
|
|
||||||
input(type="checkbox" name="schoolFilter" value="Top 20 Eng.")
|
|
||||||
| Top 20 Eng.
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="schoolFilter" value="Other US")
|
|
||||||
| Other US
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="schoolFilter" value="Other Intl.")
|
|
||||||
| Other Intl.
|
|
||||||
.filter_section#location_filter
|
|
||||||
h4 Location
|
|
||||||
input(type="checkbox" name="locationFilter" value="Bay Area")
|
|
||||||
| Bay Area
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="locationFilter" value="New York")
|
|
||||||
| New York
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="locationFilter" value="Other US")
|
|
||||||
| Other US
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="locationFilter" value="International")
|
|
||||||
| International
|
|
||||||
.filter_section#role_filter
|
|
||||||
h4 Role
|
|
||||||
input(type="checkbox" name="roleFilter" value="Web Developer")
|
|
||||||
| Web Developer
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="roleFilter" value="Software Developer")
|
|
||||||
| Software Developer
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="roleFilter" value="iOS Developer")
|
|
||||||
| iOS Developer
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="roleFilter" value="Android Developer")
|
|
||||||
| Android Developer
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="roleFilter" value="Project Manager")
|
|
||||||
| Project Developer
|
|
||||||
.filter_section#seniority_filter
|
|
||||||
h4 Seniority
|
|
||||||
input(type="checkbox" name="seniorityFilter" value="College Student")
|
|
||||||
| College Student
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="seniorityFilter" value="Recent Grad")
|
|
||||||
| Recent Grad
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="seniorityFilter" value="Junior")
|
|
||||||
| Junior
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="seniorityFilter" value="Senior")
|
|
||||||
| Senior
|
|
||||||
br
|
|
||||||
input(type="checkbox" name="seniorityFilter" value="Management")
|
|
||||||
| Management
|
|
||||||
//input#select_all_checkbox(type="checkbox" name="select_all" checked)
|
|
||||||
//| Select all
|
|
||||||
button.btn#filter-button Filter
|
|
||||||
p#results #{numberOfCandidates} results
|
|
||||||
//button.btn#create-alert-button Create Alert
|
|
||||||
if candidates.length
|
|
||||||
#candidate-table
|
|
||||||
table
|
|
||||||
tbody
|
|
||||||
for candidate, index in featuredCandidates
|
|
||||||
- var profile = candidate.get('jobProfile');
|
|
||||||
- var authorized = candidate.id; // If we have the id, then we are authorized.
|
|
||||||
- var profileAge = (new Date() - new Date(profile.updated)) / 86400 / 1000;
|
|
||||||
- var expired = profileAge > 2 * 30.4;
|
|
||||||
- var curated = profile.curated;
|
|
||||||
|
|
||||||
tr.candidate-row(data-candidate-id=candidate.id, id=candidate.id, class=expired ? "expired" : "")
|
|
||||||
td(rowspan=2)
|
|
||||||
.candidate-picture
|
|
||||||
img(src=candidate.getPhotoURL(50), alt=profile.name, title=profile.name, width=50)
|
|
||||||
if curated && curated.shortDescription
|
|
||||||
td.candidate-description #{curated.shortDescription}
|
|
||||||
else
|
|
||||||
td.candidate-description #{profile.shortDescription}
|
|
||||||
tr.border_row(data-candidate-id=candidate.id)
|
|
||||||
if curated
|
|
||||||
- var workHistory = curated.workHistory.join(",");
|
|
||||||
td.tag_column
|
|
||||||
img(src="/images/pages/employer/tag.png")
|
|
||||||
| #{curated.mainTag}
|
|
||||||
td.location_column
|
|
||||||
img(src="/images/pages/employer/location.png")
|
|
||||||
| #{curated.location}
|
|
||||||
td.education_column
|
|
||||||
img(src="/images/pages/employer/education.png")
|
|
||||||
| #{curated.education}
|
|
||||||
td.work_column
|
|
||||||
if workHistory
|
|
||||||
img(src="/images/pages/employer/briefcase.png")
|
|
||||||
| #{workHistory}
|
|
||||||
else
|
|
||||||
td Hi
|
|
||||||
|
|
||||||
if !isEmployer && !me.isAdmin()
|
tr.candidate-row(data-candidate-id=candidate.id, id=candidate.id, class=expired ? "expired" : "")
|
||||||
|
td(rowspan=3)
|
||||||
|
.candidate-picture
|
||||||
|
img(src=candidate.getPhotoURL(photoSize, false, true), alt=profile.name, title=profile.name, width=photoSize)
|
||||||
|
if fullProfiles
|
||||||
|
td.candidate-name-cell
|
||||||
|
strong= profile.name
|
||||||
|
| -
|
||||||
|
span= profile.jobTitle
|
||||||
|
tr.description_row(data-candidate-id=candidate.id)
|
||||||
|
if curated && curated.shortDescription
|
||||||
|
td.candidate-description #{curated.shortDescription}
|
||||||
|
else
|
||||||
|
td.candidate-description #{profile.shortDescription}
|
||||||
|
tr.border_row(data-candidate-id=candidate.id)
|
||||||
|
if curated
|
||||||
|
- var workHistory = curated.workHistory.join(",");
|
||||||
|
if !fullProfiles
|
||||||
|
td.tag_column
|
||||||
|
img(src="/images/pages/employer/tag.png")
|
||||||
|
| #{profile.jobTitle}
|
||||||
|
td.location_column
|
||||||
|
img(src="/images/pages/employer/location.png")
|
||||||
|
| #{curated.location}
|
||||||
|
td.education_column
|
||||||
|
img(src="/images/pages/employer/education.png")
|
||||||
|
| #{curated.education}
|
||||||
|
td.work_column
|
||||||
|
if workHistory
|
||||||
|
img(src="/images/pages/employer/briefcase.png")
|
||||||
|
| #{workHistory}
|
||||||
|
if fullProfiles
|
||||||
|
.col-md-3
|
||||||
|
#filter
|
||||||
|
.panel-group#filter_panel
|
||||||
|
a#filter-link(data-toggle="collapse" data-target="#collapseOne")
|
||||||
|
.panel.panel-default
|
||||||
|
.panel-heading
|
||||||
|
h4.panel-title
|
||||||
|
span.glyphicon.glyphicon-folder-open#folder-icon
|
||||||
|
| Filter
|
||||||
|
.panel-collapse.collapse.in#collapseOne
|
||||||
|
.panel-body
|
||||||
|
p
|
||||||
|
strong We've already technically screened all our candidates
|
||||||
|
| , but you can also filter further:
|
||||||
|
form#filters
|
||||||
|
.filter_section#visa_filter
|
||||||
|
h4 Visa
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="visa" value="Authorized to work in the US")
|
||||||
|
| US Authorized (#{candidatesInFilter("visa","Authorized to work in the US")})
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="visa" value="Need visa sponsorship")
|
||||||
|
| Not Authorized (#{candidatesInFilter("visa","Need visa sponsorship")})
|
||||||
|
.filter_section#school_filter
|
||||||
|
h4 Education
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="schoolFilter" value="Top School")
|
||||||
|
| Top School (#{candidatesInFilter("schoolFilter","Top School")})
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="schoolFilter" value="Other")
|
||||||
|
| Other (#{candidatesInFilter("schoolFilter","Other")})
|
||||||
|
.filter_section#role_filter
|
||||||
|
h4 Role
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="roleFilter" value="Web Developer")
|
||||||
|
| Web Developer (#{candidatesInFilter("roleFilter","Web Developer")})
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="roleFilter" value="Software Developer")
|
||||||
|
| Software Developer (#{candidatesInFilter("roleFilter","Software Developer")})
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="roleFilter" value="Mobile Developer")
|
||||||
|
| Mobile Developer (#{candidatesInFilter("roleFilter","Mobile Developer")})
|
||||||
|
.filter_section#seniority_filter
|
||||||
|
h4 Experience
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="seniorityFilter" value="Senior")
|
||||||
|
| Senior (#{candidatesInFilter("seniorityFilter","Senior")})
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="seniorityFilter" value="Junior")
|
||||||
|
| Junior (#{candidatesInFilter("seniorityFilter","Junior")})
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="seniorityFilter" value="Recent Grad")
|
||||||
|
| Recent Grad (#{candidatesInFilter("seniorityFilter","Recent Grad")})
|
||||||
|
label
|
||||||
|
input(type="checkbox" name="seniorityFilter" value="College Student")
|
||||||
|
| College Student (#{candidatesInFilter("seniorityFilter","College Student")})
|
||||||
|
|
||||||
|
//input#select_all_checkbox(type="checkbox" name="select_all" checked)
|
||||||
|
//| Select all
|
||||||
|
p#results #{numberOfCandidates} results
|
||||||
|
//button.btn#create-alert-button Create Alert
|
||||||
|
|
||||||
|
|
||||||
|
if !fullProfiles
|
||||||
div#info_wrapper
|
div#info_wrapper
|
||||||
span.hiring-call-to-action
|
span.hiring-call-to-action
|
||||||
h2#start-hiring(data-i18n="employers.start_hiring") Start hiring.
|
h2#start-hiring(data-i18n="employers.start_hiring") Start hiring.
|
||||||
button.btn.get-started-button Get started
|
button.btn.get-started-button.employer-button Get started
|
||||||
|
|
||||||
h2#hiring-reasons.hiring-call-to-action(data-i18n="employers.reasons") 3 reasons you should hire through us:
|
h2#hiring-reasons.hiring-call-to-action(data-i18n="employers.reasons") 3 reasons you should hire through us:
|
||||||
.reasons#top_row
|
.reasons#top_row
|
||||||
|
@ -153,16 +141,14 @@ block content
|
||||||
h3(data-i18n="employers.weeding") We've done the weeding for you.
|
h3(data-i18n="employers.weeding") We've done the weeding for you.
|
||||||
//this will break in i18n. Fix the inlining
|
//this will break in i18n. Fix the inlining
|
||||||
p(data-i18n="employers.weeding_blurb")
|
p(data-i18n="employers.weeding_blurb")
|
||||||
| Every candidate that has a
|
| We only feature developers that we would work with. We've reviewed each profile (in addition to meeting with many of the candidates.)
|
||||||
span.glyphicon.glyphicon-earphone
|
|
||||||
| icon has already gone through a phone screen with us. We only feature developers that we would work with.
|
|
||||||
.reason
|
.reason
|
||||||
img(class="employer_icon" src="/images/pages/employer/employer_icon3.png")
|
img(class="employer_icon" src="/images/pages/employer/employer_icon3.png")
|
||||||
h3(data-i18n="employers.pass_screen") They will pass your technical screen.
|
h3(data-i18n="employers.pass_screen") They will pass your technical screen.
|
||||||
p(data-i18n="employers.pass_screen_blurb") All of these developers have ranked in our programming competitions. One employer found that 5x as many of our devs passed their technical screen than hiring from Hacker News.
|
p(data-i18n="employers.pass_screen_blurb") All of these developers have ranked in our programming competitions. One employer found that 5x as many of our devs passed their technical screen than hiring from Hacker News.
|
||||||
span.hiring-call-to-action
|
span.hiring-call-to-action
|
||||||
h2(data-i18n="employers.make_hiring_easier") Make my hiring easier, please.
|
h2(data-i18n="employers.make_hiring_easier") Make my hiring easier, please.
|
||||||
button.btn.get-started-button Get started
|
button.btn.get-started-button.employer-button Get started
|
||||||
.reasons#bottom_row
|
.reasons#bottom_row
|
||||||
.reason_long
|
.reason_long
|
||||||
img.employer_icon(src="/images/pages/employer/employer_icon1.png")
|
img.employer_icon(src="/images/pages/employer/employer_icon1.png")
|
||||||
|
|
|
@ -19,12 +19,19 @@ block modal-body-content
|
||||||
p(data-i18n="signup.description") It's free. Just need a couple things and you'll be good to go:
|
p(data-i18n="signup.description") It's free. Just need a couple things and you'll be good to go:
|
||||||
|
|
||||||
form.form
|
form.form
|
||||||
.form-group
|
if onEmployersPage
|
||||||
label.control-label(for="email", data-i18n="general.email") Email
|
.form-group
|
||||||
input#email.input-large.form-control(name="email", type="email", value=formValues.email)
|
input#email.input-large.form-control(name="email", type="email", value=formValues.email, placeholder="Email")
|
||||||
.form-group
|
.form-group
|
||||||
label.control-label(for="password", data-i18n="general.password") Password
|
input#password.input-large.form-control(name="password", type="password", value=formValues.password, placeholder="Password")
|
||||||
input#password.input-large.form-control(name="password", type="password", value=formValues.password)
|
|
||||||
|
else
|
||||||
|
.form-group
|
||||||
|
label.control-label(for="email", data-i18n="general.email") Email
|
||||||
|
input#email.input-large.form-control(name="email", type="email", value=formValues.email)
|
||||||
|
.form-group
|
||||||
|
label.control-label(for="password", data-i18n="general.password") Password
|
||||||
|
input#password.input-large.form-control(name="password", type="password", value=formValues.password)
|
||||||
|
|
||||||
if mode === 'signup'
|
if mode === 'signup'
|
||||||
.form-group.checkbox
|
.form-group.checkbox
|
||||||
|
@ -38,8 +45,11 @@ block modal-body-content
|
||||||
a(href="https://en.wikipedia.org/wiki/Children's_Online_Privacy_Protection_Act", data-i18n="signup.coppa_why", target="_blank") (Why?)
|
a(href="https://en.wikipedia.org/wiki/Children's_Online_Privacy_Protection_Act", data-i18n="signup.coppa_why", target="_blank") (Why?)
|
||||||
|
|
||||||
if mode === 'login'
|
if mode === 'login'
|
||||||
input.btn.btn-info.btn-large#login-button(value=translate("login.log_in"), type="submit")
|
if onEmployersPage
|
||||||
.btn.btn-default.btn-large#switch-to-signup-button(data-i18n="login.sign_up") Create Account
|
input.btn.btn-info.btn-large#login-button(value=translate("login.log_in"), type="submit")
|
||||||
|
else
|
||||||
|
input.btn.btn-info.btn-large#login-button(value=translate("login.log_in"), type="submit")
|
||||||
|
.btn.btn-default.btn-large#switch-to-signup-button(data-i18n="login.sign_up") Create Account
|
||||||
if mode === 'signup'
|
if mode === 'signup'
|
||||||
input.btn.btn-info.btn-large#signup-button(value=translate("signup.sign_up"), type="submit")
|
input.btn.btn-info.btn-large#signup-button(value=translate("signup.sign_up"), type="submit")
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ extends /templates/modal/modal_base
|
||||||
|
|
||||||
block modal-header-content
|
block modal-header-content
|
||||||
if userIsAnonymous || !userIsAuthorized
|
if userIsAnonymous || !userIsAuthorized
|
||||||
h3(data-i18n="employer_signup.title") Sign up to hire CodeCombat players!
|
h3(data-i18n="employer_signup.title") Sign Up to Hire CodeCombat Players
|
||||||
else
|
else
|
||||||
h3 CodeCombat Placement Agreement
|
h3 CodeCombat Placement Agreement
|
||||||
|
|
||||||
|
@ -13,28 +13,17 @@ block modal-body-content
|
||||||
else if sentMoreInfoEmail
|
else if sentMoreInfoEmail
|
||||||
| Thanks! You should receive an email from George shortly.
|
| Thanks! You should receive an email from George shortly.
|
||||||
else
|
else
|
||||||
h4(data-i18n="employer_signup.sub_heading") Let us find your next brilliant developers.
|
|
||||||
p Create an account to get started!
|
|
||||||
.form#signup-form
|
.form#signup-form
|
||||||
.form-group
|
.form-group
|
||||||
label.control-label(for="signup-email", data-i18n="general.email") Email
|
input#signup-email.form-control.input-large(name="email",type="email" placeholder="Email")
|
||||||
input#signup-email.form-control.input-large(name="email",type="email")
|
.form-group
|
||||||
.form-group
|
input#signup-password.input-large.form-control(name="password", type="password" placeholder="Password")
|
||||||
label.control-label(for="signup-password", data-i18n="general.password") Password
|
|
||||||
input#signup-password.input-large.form-control(name="password", type="password")
|
|
||||||
.modal-footer.linkedin
|
.modal-footer.linkedin
|
||||||
button.btn.btn-primary(id="create-account-button") Create Account
|
button.btn.btn-primary(id="create-account-button") Create Account
|
||||||
br
|
br
|
||||||
br
|
br
|
||||||
| Already have a CodeCombat account?
|
| Already have a CodeCombat account?
|
||||||
a.login-link(data-toggle="coco-modal", data-target="modal/auth") Log in to continue!
|
a.login-link(data-toggle="coco-modal", data-target="modal/auth") Log in to continue!
|
||||||
h4 Want more information first?
|
|
||||||
p Enter your email and George, our CEO, will contact you shortly.
|
|
||||||
.form
|
|
||||||
.form-group
|
|
||||||
label.control-label(for="more-info-email", data-i18n="general.email") Email
|
|
||||||
input#more-info-email.form-control.input-large(name="more-info-email",type="email")
|
|
||||||
button.btn.btn-primary(id="more-info-button") Send me more information!
|
|
||||||
else if !userIsAuthorized
|
else if !userIsAuthorized
|
||||||
.modal-footer.linkedin
|
.modal-footer.linkedin
|
||||||
p Please sign into your LinkedIn account to verify your identity.
|
p Please sign into your LinkedIn account to verify your identity.
|
||||||
|
|
|
@ -17,4 +17,4 @@ block modal-body-wait-content
|
||||||
.progress-bar
|
.progress-bar
|
||||||
|
|
||||||
block modal-footer-content
|
block modal-footer-content
|
||||||
button.btn.btn-primary.btn-large#wizard-settings-done(type="button") Done
|
button.btn.btn-primary.btn-large#wizard-settings-done(data-dismiss="modal", type="button") Done
|
||||||
|
|
|
@ -197,14 +197,28 @@ class ImageFileTreema extends TreemaNode.nodeMap.string
|
||||||
@flushChanges()
|
@flushChanges()
|
||||||
@refreshDisplay()
|
@refreshDisplay()
|
||||||
|
|
||||||
class CoffeeTreema extends TreemaNode.nodeMap.ace
|
|
||||||
|
codeLanguages =
|
||||||
|
javascript: 'ace/mode/javascript'
|
||||||
|
coffeescript: 'ace/mode/coffee'
|
||||||
|
python: 'ace/mode/python'
|
||||||
|
clojure: 'ace/mode/clojure'
|
||||||
|
lua: 'ace/mode/lua'
|
||||||
|
io: 'ace/mode/text'
|
||||||
|
|
||||||
|
class CodeLanguagesObjectTreema extends TreemaNode.nodeMap.object
|
||||||
|
childPropertiesAvailable: ->
|
||||||
|
(key for key in _.keys(codeLanguages) when not @data[key]?)
|
||||||
|
|
||||||
|
class CodeTreema extends TreemaNode.nodeMap.ace
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super(arguments...)
|
super(arguments...)
|
||||||
@schema.aceMode = 'ace/mode/coffee'
|
@schema.aceTabSize = 4
|
||||||
@schema.aceTabSize = 2
|
|
||||||
|
|
||||||
buildValueForEditing: (valEl) ->
|
buildValueForEditing: (valEl) ->
|
||||||
super(valEl)
|
super(valEl)
|
||||||
|
if not @schema.aceMode and mode = codeLanguages[@keyForParent]
|
||||||
|
@editor.getSession().setMode mode
|
||||||
@editor.on('change', @onEditorChange)
|
@editor.on('change', @onEditorChange)
|
||||||
valEl
|
valEl
|
||||||
|
|
||||||
|
@ -213,15 +227,18 @@ class CoffeeTreema extends TreemaNode.nodeMap.ace
|
||||||
@flushChanges()
|
@flushChanges()
|
||||||
@getRoot().broadcastChanges()
|
@getRoot().broadcastChanges()
|
||||||
|
|
||||||
class JavaScriptTreema extends CoffeeTreema
|
class CoffeeTreema extends CodeTreema
|
||||||
|
constructor: ->
|
||||||
|
super(arguments...)
|
||||||
|
@schema.aceMode = 'ace/mode/coffee'
|
||||||
|
@schema.aceTabSize = 2
|
||||||
|
|
||||||
|
class JavaScriptTreema extends CodeTreema
|
||||||
constructor: ->
|
constructor: ->
|
||||||
super(arguments...)
|
super(arguments...)
|
||||||
@schema.aceMode = 'ace/mode/javascript'
|
@schema.aceMode = 'ace/mode/javascript'
|
||||||
@schema.aceTabSize = 4
|
@schema.aceTabSize = 4
|
||||||
|
|
||||||
KB = 1024
|
|
||||||
MB = 1024*1024
|
|
||||||
|
|
||||||
|
|
||||||
class InternationalizationNode extends TreemaNode.nodeMap.object
|
class InternationalizationNode extends TreemaNode.nodeMap.object
|
||||||
findLanguageName: (languageCode) ->
|
findLanguageName: (languageCode) ->
|
||||||
|
@ -246,8 +263,7 @@ class InternationalizationNode extends TreemaNode.nodeMap.object
|
||||||
#this must be filled out in order for the i18n node to work
|
#this must be filled out in order for the i18n node to work
|
||||||
|
|
||||||
childPropertiesAvailable: ->
|
childPropertiesAvailable: ->
|
||||||
return _.keys locale
|
(key for key in _.keys(locale) when not @data[key]?)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class LatestVersionCollection extends CocoCollection
|
class LatestVersionCollection extends CocoCollection
|
||||||
|
@ -395,6 +411,8 @@ module.exports.setup = ->
|
||||||
TreemaNode.setNodeSubclass('date-time', DateTimeTreema)
|
TreemaNode.setNodeSubclass('date-time', DateTimeTreema)
|
||||||
TreemaNode.setNodeSubclass('version', VersionTreema)
|
TreemaNode.setNodeSubclass('version', VersionTreema)
|
||||||
TreemaNode.setNodeSubclass('markdown', LiveEditingMarkup)
|
TreemaNode.setNodeSubclass('markdown', LiveEditingMarkup)
|
||||||
|
TreemaNode.setNodeSubclass('code-languages-object', CodeLanguagesObjectTreema)
|
||||||
|
TreemaNode.setNodeSubclass('code', CodeTreema)
|
||||||
TreemaNode.setNodeSubclass('coffee', CoffeeTreema)
|
TreemaNode.setNodeSubclass('coffee', CoffeeTreema)
|
||||||
TreemaNode.setNodeSubclass('javascript', JavaScriptTreema)
|
TreemaNode.setNodeSubclass('javascript', JavaScriptTreema)
|
||||||
TreemaNode.setNodeSubclass('image-file', ImageFileTreema)
|
TreemaNode.setNodeSubclass('image-file', ImageFileTreema)
|
||||||
|
|
|
@ -11,6 +11,11 @@ module.exports = class WizardSettingsView extends CocoView
|
||||||
startsLoading: true
|
startsLoading: true
|
||||||
|
|
||||||
events:
|
events:
|
||||||
|
'click .color-group': (e) ->
|
||||||
|
return if $(e.target).closest('.minicolors')[0]
|
||||||
|
return if $(e.target).closest('.color-group-checkbox')[0]
|
||||||
|
return if $(e.target).closest('label')[0]
|
||||||
|
$(e.target).closest('.color-group').find('.color-group-checkbox').click()
|
||||||
'change .color-group-checkbox': (e) ->
|
'change .color-group-checkbox': (e) ->
|
||||||
colorGroup = $(e.target).closest('.color-group')
|
colorGroup = $(e.target).closest('.color-group')
|
||||||
@updateColorSettings(colorGroup)
|
@updateColorSettings(colorGroup)
|
||||||
|
@ -47,7 +52,7 @@ module.exports = class WizardSettingsView extends CocoView
|
||||||
exists: wizardSettings[name]
|
exists: wizardSettings[name]
|
||||||
rgb: hslToHex(hsl)
|
rgb: hslToHex(hsl)
|
||||||
}
|
}
|
||||||
c.colorGroups = (f(colorName) for colorName in _.keys colorGroups)
|
c.colorGroups = (f(colorName) for colorName in _.keys colorGroups when colorName isnt 'team')
|
||||||
c
|
c
|
||||||
|
|
||||||
afterRender: ->
|
afterRender: ->
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
View = require 'views/kinds/RootView'
|
View = require 'views/kinds/RootView'
|
||||||
VersionHistoryView = require './versions_view'
|
VersionHistoryView = require './versions_view'
|
||||||
ErrorView = require '../../error_view'
|
|
||||||
template = require 'templates/editor/article/edit'
|
template = require 'templates/editor/article/edit'
|
||||||
Article = require 'models/Article'
|
Article = require 'models/Article'
|
||||||
SaveVersionModal = require 'views/modal/save_version_modal'
|
SaveVersionModal = require 'views/modal/save_version_modal'
|
||||||
|
PatchesView = require 'views/editor/patches_view'
|
||||||
|
|
||||||
module.exports = class ArticleEditView extends View
|
module.exports = class ArticleEditView extends View
|
||||||
id: 'editor-article-edit-view'
|
id: 'editor-article-edit-view'
|
||||||
|
@ -37,7 +37,7 @@ module.exports = class ArticleEditView extends View
|
||||||
@article.fetch()
|
@article.fetch()
|
||||||
@listenToOnce(@article, 'sync', @buildTreema)
|
@listenToOnce(@article, 'sync', @buildTreema)
|
||||||
@pushChangesToPreview = _.throttle(@pushChangesToPreview, 500)
|
@pushChangesToPreview = _.throttle(@pushChangesToPreview, 500)
|
||||||
|
|
||||||
buildTreema: ->
|
buildTreema: ->
|
||||||
return if @treema? or (not @article.loaded)
|
return if @treema? or (not @article.loaded)
|
||||||
unless @article.attributes.body
|
unless @article.attributes.body
|
||||||
|
@ -68,13 +68,15 @@ module.exports = class ArticleEditView extends View
|
||||||
getRenderData: (context={}) ->
|
getRenderData: (context={}) ->
|
||||||
context = super(context)
|
context = super(context)
|
||||||
context.article = @article
|
context.article = @article
|
||||||
context.authorized = me.isAdmin() or @article.hasWriteAccess(me)
|
context.authorized = not me.get('anonymous')
|
||||||
context
|
context
|
||||||
|
|
||||||
afterRender: ->
|
afterRender: ->
|
||||||
super()
|
super()
|
||||||
return if @startsLoading
|
return if @startsLoading
|
||||||
@showReadOnly() if me.get('anonymous')
|
@showReadOnly() if me.get('anonymous')
|
||||||
|
@patchesView = @insertSubView(new PatchesView(@article), @$el.find('.patches-view'))
|
||||||
|
@patchesView.load()
|
||||||
|
|
||||||
openPreview: ->
|
openPreview: ->
|
||||||
@preview = window.open('/editor/article/x/preview', 'preview', 'height=800,width=600')
|
@preview = window.open('/editor/article/x/preview', 'preview', 'height=800,width=600')
|
||||||
|
|
|
@ -13,7 +13,12 @@ module.exports = class LevelComponentNewView extends View
|
||||||
events:
|
events:
|
||||||
'click #new-level-component-submit': 'makeNewLevelComponent'
|
'click #new-level-component-submit': 'makeNewLevelComponent'
|
||||||
'submit form': 'makeNewLevelComponent'
|
'submit form': 'makeNewLevelComponent'
|
||||||
|
|
||||||
|
getRenderData: ->
|
||||||
|
c = super()
|
||||||
|
c.systems = LevelComponent.schema.properties.system.enum
|
||||||
|
c
|
||||||
|
|
||||||
makeNewLevelComponent: (e) ->
|
makeNewLevelComponent: (e) ->
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
system = @$el.find('#level-component-system').val()
|
system = @$el.find('#level-component-system').val()
|
||||||
|
|
|
@ -58,7 +58,7 @@ module.exports = class ThangTypeEditView extends View
|
||||||
context = super(context)
|
context = super(context)
|
||||||
context.thangType = @thangType
|
context.thangType = @thangType
|
||||||
context.animations = @getAnimationNames()
|
context.animations = @getAnimationNames()
|
||||||
context.authorized = me.isAdmin() or @thangType.hasWriteAccess(me)
|
context.authorized = not me.get('anonymous')
|
||||||
context
|
context
|
||||||
|
|
||||||
getAnimationNames: ->
|
getAnimationNames: ->
|
||||||
|
@ -350,7 +350,7 @@ module.exports = class ThangTypeEditView extends View
|
||||||
schema: schema
|
schema: schema
|
||||||
files: @files
|
files: @files
|
||||||
filePath: "db/thang.type/#{@thangType.get('original')}"
|
filePath: "db/thang.type/#{@thangType.get('original')}"
|
||||||
readOnly: true unless me.isAdmin() or @thangType.hasWriteAccess(me)
|
readOnly: me.get('anonymous')
|
||||||
callbacks:
|
callbacks:
|
||||||
change: @pushChangesToPreview
|
change: @pushChangesToPreview
|
||||||
select: @onSelectNode
|
select: @onSelectNode
|
||||||
|
|
|
@ -21,6 +21,7 @@ module.exports = class EmployersView extends View
|
||||||
|
|
||||||
events:
|
events:
|
||||||
'click tbody tr': 'onCandidateClicked'
|
'click tbody tr': 'onCandidateClicked'
|
||||||
|
'click #logout-link': 'logoutAccount'
|
||||||
'change #filters input': 'onFilterChanged'
|
'change #filters input': 'onFilterChanged'
|
||||||
'click #filter-button': 'applyFilters'
|
'click #filter-button': 'applyFilters'
|
||||||
'change #select_all_checkbox': 'handleSelectAllChange'
|
'change #select_all_checkbox': 'handleSelectAllChange'
|
||||||
|
@ -69,6 +70,7 @@ module.exports = class EmployersView extends View
|
||||||
for filterName, filterValues of @filters
|
for filterName, filterValues of @filters
|
||||||
if filterValues.length is 0
|
if filterValues.length is 0
|
||||||
@filters[filterName] = @defaultFilters[filterName]
|
@filters[filterName] = @defaultFilters[filterName]
|
||||||
|
@applyFilters()
|
||||||
|
|
||||||
openSignupModal: ->
|
openSignupModal: ->
|
||||||
@openModalView new EmployerSignupView
|
@openModalView new EmployerSignupView
|
||||||
|
@ -111,23 +113,43 @@ module.exports = class EmployersView extends View
|
||||||
@filters =
|
@filters =
|
||||||
phoneScreenFilter: [true, false]
|
phoneScreenFilter: [true, false]
|
||||||
visa: ['Authorized to work in the US', 'Need visa sponsorship']
|
visa: ['Authorized to work in the US', 'Need visa sponsorship']
|
||||||
schoolFilter: ['Top 20 Eng.', 'Other US', 'Other Intl.']
|
schoolFilter: ['Top School', 'Other']
|
||||||
locationFilter: ['Bay Area', 'New York', 'Other US', 'International']
|
locationFilter: ['Bay Area', 'New York', 'Other US', 'International']
|
||||||
roleFilter: ['Web Developer', 'Software Developer', 'iOS Developer', 'Android Developer', 'Project Manager']
|
roleFilter: ['Web Developer', 'Software Developer', 'Mobile Developer']
|
||||||
seniorityFilter: ['College Student', 'Recent Grad', 'Junior', 'Senior', 'Management']
|
seniorityFilter: ['College Student', 'Recent Grad', 'Junior', 'Senior']
|
||||||
@defaultFilters = _.cloneDeep @filters
|
@defaultFilters = _.cloneDeep @filters
|
||||||
|
|
||||||
|
candidatesInFilter: (filterName, filterValue) =>
|
||||||
|
candidates = @getActiveAndApprovedCandidates()
|
||||||
|
if filterName and filterValue
|
||||||
|
if filterName is 'visa'
|
||||||
|
return (_.filter candidates, (c) -> c.get('jobProfile').visa is filterValue).length
|
||||||
|
else
|
||||||
|
return (_.filter candidates, (c) -> c.get('jobProfile').curated?[filterName] is filterValue).length
|
||||||
|
else
|
||||||
|
return Math.floor(Math.random() * 500)
|
||||||
|
|
||||||
|
getActiveAndApprovedCandidates: =>
|
||||||
|
candidates = _.filter @candidates.models, (c) -> c.get('jobProfile').active
|
||||||
|
return _.filter candidates, (c) -> c.get('jobProfileApproved')
|
||||||
|
|
||||||
getRenderData: ->
|
getRenderData: ->
|
||||||
ctx = super()
|
ctx = super()
|
||||||
ctx.isEmployer = @isEmployer()
|
ctx.isEmployer = @isEmployer()
|
||||||
|
#If you change the candidates displayed, change candidatesInFilter()
|
||||||
ctx.candidates = _.sortBy @candidates.models, (c) -> -1 * c.get('jobProfile').experience
|
ctx.candidates = _.sortBy @candidates.models, (c) -> -1 * c.get('jobProfile').experience
|
||||||
|
ctx.candidates = _.sortBy ctx.candidates, (c) -> not c.get('jobProfile').curated?
|
||||||
|
ctx.candidates = _.sortBy ctx.candidates, (c) -> c.get('jobProfile').curated?.featured
|
||||||
ctx.activeCandidates = _.filter ctx.candidates, (c) -> c.get('jobProfile').active
|
ctx.activeCandidates = _.filter ctx.candidates, (c) -> c.get('jobProfile').active
|
||||||
ctx.inactiveCandidates = _.reject ctx.candidates, (c) -> c.get('jobProfile').active
|
ctx.inactiveCandidates = _.reject ctx.candidates, (c) -> c.get('jobProfile').active
|
||||||
ctx.featuredCandidates = _.filter ctx.activeCandidates, (c) -> c.get('jobProfileApproved')
|
ctx.featuredCandidates = _.filter ctx.activeCandidates, (c) -> c.get('jobProfileApproved')
|
||||||
|
|
||||||
unless @isEmployer() or me.isAdmin()
|
unless @isEmployer() or me.isAdmin()
|
||||||
ctx.featuredCandidates = _.filter ctx.featuredCandidates, (c) -> c.get('jobProfile').curated
|
ctx.featuredCandidates = _.filter ctx.featuredCandidates, (c) -> c.get('jobProfile').curated
|
||||||
ctx.featuredCandidates = ctx.featuredCandidates.slice(0,7)
|
ctx.featuredCandidates = ctx.featuredCandidates.slice(0,7)
|
||||||
|
if me.isAdmin()
|
||||||
|
ctx.featuredCandidates = ctx.candidates
|
||||||
|
ctx.candidatesInFilter = @candidatesInFilter
|
||||||
ctx.otherCandidates = _.reject ctx.activeCandidates, (c) -> c.get('jobProfileApproved')
|
ctx.otherCandidates = _.reject ctx.activeCandidates, (c) -> c.get('jobProfileApproved')
|
||||||
ctx.remarks = {}
|
ctx.remarks = {}
|
||||||
ctx.remarks[remark.get('user')] = remark for remark in @remarks.models
|
ctx.remarks[remark.get('user')] = remark for remark in @remarks.models
|
||||||
|
@ -158,7 +180,7 @@ module.exports = class EmployersView extends View
|
||||||
# $('.nano').nanoScroller({scrollTo: $(window.location.hash)})
|
# $('.nano').nanoScroller({scrollTo: $(window.location.hash)})
|
||||||
|
|
||||||
checkForEmployerSignupHash: =>
|
checkForEmployerSignupHash: =>
|
||||||
if window.location.hash is '#employerSignupLoggingIn' and not ('employer' in me.get('permissions'))
|
if window.location.hash is '#employerSignupLoggingIn' and not ('employer' in me.get('permissions')) and not me.isAdmin()
|
||||||
@openModalView application.router.getView('modal/employer_signup', '_modal')
|
@openModalView application.router.getView('modal/employer_signup', '_modal')
|
||||||
window.location.hash = ''
|
window.location.hash = ''
|
||||||
|
|
||||||
|
@ -278,7 +300,9 @@ module.exports = class EmployersView extends View
|
||||||
8:
|
8:
|
||||||
'✓': filterSelectExactMatch
|
'✓': filterSelectExactMatch
|
||||||
'✗': filterSelectExactMatch
|
'✗': filterSelectExactMatch
|
||||||
|
logoutAccount: ->
|
||||||
|
window.location.hash = ''
|
||||||
|
super()
|
||||||
onCandidateClicked: (e) ->
|
onCandidateClicked: (e) ->
|
||||||
id = $(e.target).closest('tr').data('candidate-id')
|
id = $(e.target).closest('tr').data('candidate-id')
|
||||||
if id and (@isEmployer() or me.isAdmin())
|
if id and (@isEmployer() or me.isAdmin())
|
||||||
|
|
|
@ -137,12 +137,14 @@ module.exports = class CocoView extends Backbone.View
|
||||||
resourceIndex: r.rid,
|
resourceIndex: r.rid,
|
||||||
responseText: r.jqxhr?.responseText
|
responseText: r.jqxhr?.responseText
|
||||||
})).i18n()
|
})).i18n()
|
||||||
|
@$el.find('.progress').hide()
|
||||||
|
|
||||||
onRetryResource: (e) ->
|
onRetryResource: (e) ->
|
||||||
res = @supermodel.getResource($(e.target).data('resource-index'))
|
res = @supermodel.getResource($(e.target).data('resource-index'))
|
||||||
# different views may respond to this call, and not all have the resource to reload
|
# different views may respond to this call, and not all have the resource to reload
|
||||||
return unless res and res.isFailed
|
return unless res and res.isFailed
|
||||||
res.load()
|
res.load()
|
||||||
|
@$el.find('.progress').show()
|
||||||
$(e.target).closest('.loading-error-alert').remove()
|
$(e.target).closest('.loading-error-alert').remove()
|
||||||
|
|
||||||
# Modals
|
# Modals
|
||||||
|
|
|
@ -32,6 +32,10 @@ module.exports = class ModalView extends CocoView
|
||||||
|
|
||||||
afterRender: ->
|
afterRender: ->
|
||||||
super()
|
super()
|
||||||
|
if Backbone.history.fragment is "employers"
|
||||||
|
$(@$el).find(".background-wrapper").each ->
|
||||||
|
$(this).addClass("employer-modal-background-wrapper").removeClass("background-wrapper")
|
||||||
|
|
||||||
if @modalWidthPercent
|
if @modalWidthPercent
|
||||||
@$el.find('.modal-dialog').css width: "#{@modalWidthPercent}%"
|
@$el.find('.modal-dialog').css width: "#{@modalWidthPercent}%"
|
||||||
@$el.on 'hide.bs.modal', =>
|
@$el.on 'hide.bs.modal', =>
|
||||||
|
|
|
@ -30,8 +30,9 @@ module.exports = class AuthModalView extends View
|
||||||
application.tracker.trackEvent 'Started Signup', authModalTitle: c.title, descriptionOn: c.descriptionOn
|
application.tracker.trackEvent 'Started Signup', authModalTitle: c.title, descriptionOn: c.descriptionOn
|
||||||
c.mode = @mode
|
c.mode = @mode
|
||||||
c.formValues = @previousFormInputs or {}
|
c.formValues = @previousFormInputs or {}
|
||||||
|
c.onEmployersPage = Backbone.history.fragment is "employers"
|
||||||
c
|
c
|
||||||
|
|
||||||
afterInsert: ->
|
afterInsert: ->
|
||||||
super()
|
super()
|
||||||
_.delay application.router.renderLoginButtons, 500
|
_.delay application.router.renderLoginButtons, 500
|
||||||
|
|
|
@ -15,7 +15,7 @@ module.exports = class GoldView extends View
|
||||||
@teamGold = {}
|
@teamGold = {}
|
||||||
@teamGoldEarned = {}
|
@teamGoldEarned = {}
|
||||||
@shownOnce = false
|
@shownOnce = false
|
||||||
|
|
||||||
onGoldChanged: (e) ->
|
onGoldChanged: (e) ->
|
||||||
return if @teamGold[e.team] is e.gold and @teamGoldEarned[e.team] is e.goldEarned
|
return if @teamGold[e.team] is e.gold and @teamGoldEarned[e.team] is e.goldEarned
|
||||||
@teamGold[e.team] = e.gold
|
@teamGold[e.team] = e.gold
|
||||||
|
@ -24,7 +24,7 @@ module.exports = class GoldView extends View
|
||||||
unless goldEl.length
|
unless goldEl.length
|
||||||
teamEl = teamTemplate team: e.team
|
teamEl = teamTemplate team: e.team
|
||||||
@$el[if e.team is 'humans' then 'prepend' else 'append'](teamEl)
|
@$el[if e.team is 'humans' then 'prepend' else 'append'](teamEl)
|
||||||
goldEl = $('.gold-amount.team-' + e.team, teamEl)
|
goldEl = @$el.find('.gold-amount.team-' + e.team)
|
||||||
text = '' + e.gold
|
text = '' + e.gold
|
||||||
if e.goldEarned and e.goldEarned > e.gold
|
if e.goldEarned and e.goldEarned > e.gold
|
||||||
text += " (#{e.goldEarned})"
|
text += " (#{e.goldEarned})"
|
||||||
|
@ -34,7 +34,13 @@ module.exports = class GoldView extends View
|
||||||
@shownOnce = true
|
@shownOnce = true
|
||||||
|
|
||||||
updateTitle: ->
|
updateTitle: ->
|
||||||
@$el.attr 'title', ("Team '#{team}' has #{gold} now of #{@teamGoldEarned[team]} gold earned." for team, gold of @teamGold).join ' '
|
strings = []
|
||||||
|
for team, gold of @teamGold
|
||||||
|
if @teamGoldEarned[team]
|
||||||
|
strings.push "Team '#{team}' has #{gold} now of #{@teamGoldEarned[team]} gold earned."
|
||||||
|
else
|
||||||
|
strings.push "Team '#{team}' has #{gold} gold."
|
||||||
|
@$el.attr 'title', strings.join ' '
|
||||||
|
|
||||||
onSetLetterbox: (e) ->
|
onSetLetterbox: (e) ->
|
||||||
@$el.toggle not e.on if @shownOnce
|
@$el.toggle not e.on if @shownOnce
|
||||||
|
|
|
@ -274,13 +274,14 @@ module.exports = class PlayLevelView extends View
|
||||||
# Once Surface is Loaded ####################################################
|
# Once Surface is Loaded ####################################################
|
||||||
|
|
||||||
onLevelStarted: ->
|
onLevelStarted: ->
|
||||||
|
return unless @surface?
|
||||||
@loadingView.showReady()
|
@loadingView.showReady()
|
||||||
if window.currentModal and not window.currentModal.destroyed
|
if window.currentModal and not window.currentModal.destroyed
|
||||||
return Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelStarted, @
|
return Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelStarted, @
|
||||||
@surface.showLevel()
|
@surface.showLevel()
|
||||||
if @otherSession
|
if @otherSession
|
||||||
# TODO: colorize name and cloud by team, colorize wizard by user's color config
|
# TODO: colorize name and cloud by team, colorize wizard by user's color config
|
||||||
@surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team')
|
@surface.createOpponentWizard id: @otherSession.get('creator'), name: @otherSession.get('creatorName'), team: @otherSession.get('team'), levelSlug: @level.get('slug')
|
||||||
@loadingView?.unveil()
|
@loadingView?.unveil()
|
||||||
|
|
||||||
onLoadingViewUnveiled: (e) ->
|
onLoadingViewUnveiled: (e) ->
|
||||||
|
|
|
@ -248,6 +248,13 @@ module.exports = class PlayView extends View
|
||||||
image: '/file/db/level/529662dfe0df8f0000000007/grab_the_mushroom_icon.png'
|
image: '/file/db/level/529662dfe0df8f0000000007/grab_the_mushroom_icon.png'
|
||||||
description: 'Collect a hundred mushrooms in just five lines of code - by Nathan Gossett'
|
description: 'Collect a hundred mushrooms in just five lines of code - by Nathan Gossett'
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
name: 'Guide Everyone Home'
|
||||||
|
difficulty: 2
|
||||||
|
id: 'guide-everyone-home'
|
||||||
|
image: '/file/db/level/52740644904ac0411700067c/rescue_mission_icon.png'
|
||||||
|
description: 'Fetch the wizards teleporting into the area - by Nathan Gossett'
|
||||||
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
context.campaigns = [
|
context.campaigns = [
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
"firepad": "~0.1.2",
|
"firepad": "~0.1.2",
|
||||||
"marked": "~0.3.0",
|
"marked": "~0.3.0",
|
||||||
"moment": "~2.5.0",
|
"moment": "~2.5.0",
|
||||||
"aether": "~0.2.9",
|
"aether": "~0.2.22",
|
||||||
"underscore.string": "~2.3.3",
|
"underscore.string": "~2.3.3",
|
||||||
"firebase": "~1.0.2",
|
"firebase": "~1.0.2",
|
||||||
"catiline": "~2.9.3",
|
"catiline": "~2.9.3",
|
||||||
|
|
|
@ -65,7 +65,7 @@
|
||||||
"redis": "",
|
"redis": "",
|
||||||
"webworker-threads": "~0.4.11",
|
"webworker-threads": "~0.4.11",
|
||||||
"node-gyp": "~0.13.0",
|
"node-gyp": "~0.13.0",
|
||||||
"aether": "~0.2.9",
|
"aether": "~0.2.22",
|
||||||
"JASON": "~0.1.3",
|
"JASON": "~0.1.3",
|
||||||
"JQDeferred": "~2.1.0"
|
"JQDeferred": "~2.1.0"
|
||||||
},
|
},
|
||||||
|
|
|
@ -12,7 +12,7 @@ module.exports.startServer = ->
|
||||||
app = createAndConfigureApp()
|
app = createAndConfigureApp()
|
||||||
http.createServer(app).listen(app.get('port'))
|
http.createServer(app).listen(app.get('port'))
|
||||||
log.info('Express SSL server listening on port ' + app.get('port'))
|
log.info('Express SSL server listening on port ' + app.get('port'))
|
||||||
return app
|
app
|
||||||
|
|
||||||
createAndConfigureApp = ->
|
createAndConfigureApp = ->
|
||||||
serverSetup.setupLogging()
|
serverSetup.setupLogging()
|
||||||
|
@ -24,4 +24,3 @@ createAndConfigureApp = ->
|
||||||
serverSetup.setupMiddleware app
|
serverSetup.setupMiddleware app
|
||||||
serverSetup.setupRoutes app
|
serverSetup.setupRoutes app
|
||||||
app
|
app
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,4 @@ LevelComponentHandler = class LevelComponentHandler extends Handler
|
||||||
props.push('official') if req.user?.isAdmin()
|
props.push('official') if req.user?.isAdmin()
|
||||||
props
|
props
|
||||||
|
|
||||||
hasAccess: (req) ->
|
|
||||||
req.method is 'GET' or req.user?.isAdmin()
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = new LevelComponentHandler()
|
module.exports = new LevelComponentHandler()
|
||||||
|
|
|
@ -62,7 +62,7 @@ PatchHandler = class PatchHandler extends Handler
|
||||||
return unless watchers?.length
|
return unless watchers?.length
|
||||||
User.find({_id: {$in: watchers}}).select({email: 1, name: 1}).exec (err, watchers) =>
|
User.find({_id: {$in: watchers}}).select({email: 1, name: 1}).exec (err, watchers) =>
|
||||||
for watcher in watchers
|
for watcher in watchers
|
||||||
@sendPatchCreatedEmail req.user, watcher, doc, doc.targetLoaded, req.body.editPath
|
@sendPatchCreatedEmail req.user, watcher, doc, doc.targetLoaded, req.headers['x-current-path']
|
||||||
|
|
||||||
sendPatchCreatedEmail: (patchCreator, watcher, patch, target, editPath) ->
|
sendPatchCreatedEmail: (patchCreator, watcher, patch, target, editPath) ->
|
||||||
# return if watcher._id is patchCreator._id
|
# return if watcher._id is patchCreator._id
|
||||||
|
|
|
@ -1,34 +1,17 @@
|
||||||
mail = require '../commons/mail'
|
mail = require '../commons/mail'
|
||||||
User = require '../users/User'
|
User = require '../users/User'
|
||||||
errors = require '../commons/errors'
|
errors = require '../commons/errors'
|
||||||
#request = require 'request'
|
|
||||||
config = require '../../server_config'
|
config = require '../../server_config'
|
||||||
LevelSession = require '../levels/sessions/LevelSession'
|
LevelSession = require '../levels/sessions/LevelSession'
|
||||||
Level = require '../levels/Level'
|
Level = require '../levels/Level'
|
||||||
log = require 'winston'
|
log = require 'winston'
|
||||||
sendwithus = require '../sendwithus'
|
sendwithus = require '../sendwithus'
|
||||||
|
|
||||||
#badLog = (text) ->
|
|
||||||
# console.log text
|
|
||||||
# request.post 'http://requestb.in/1brdpaz1', { form: {log: text} }
|
|
||||||
|
|
||||||
module.exports.setup = (app) ->
|
module.exports.setup = (app) ->
|
||||||
app.all config.mail.mailchimpWebhook, handleMailchimpWebHook
|
app.all config.mail.mailchimpWebhook, handleMailchimpWebHook
|
||||||
app.get '/mail/cron/ladder-update', handleLadderUpdate
|
app.get '/mail/cron/ladder-update', handleLadderUpdate
|
||||||
|
|
||||||
getAllLadderScores = (next) ->
|
|
||||||
query = Level.find({type: 'ladder'})
|
|
||||||
.select('levelID')
|
|
||||||
.lean()
|
|
||||||
query.exec (err, levels) ->
|
|
||||||
if err
|
|
||||||
log.error 'Couldn\'t fetch ladder levels. Error: ', err
|
|
||||||
return next []
|
|
||||||
for level in levels
|
|
||||||
for team in ['humans', 'ogres']
|
|
||||||
'I ... am not doing this.'
|
|
||||||
# Query to get sessions to make histogram
|
|
||||||
# db.level.sessions.find({'submitted': true, 'levelID': 'brawlwood', team: 'ogres'}, {'_id': 0, 'totalScore': 1})
|
|
||||||
|
|
||||||
DEBUGGING = false
|
DEBUGGING = false
|
||||||
LADDER_PREGAME_INTERVAL = 2 * 3600 * 1000 # Send emails two hours before players last submitted.
|
LADDER_PREGAME_INTERVAL = 2 * 3600 * 1000 # Send emails two hours before players last submitted.
|
||||||
|
@ -95,14 +78,10 @@ sendLadderUpdateEmail = (session, now, daysAgo) ->
|
||||||
matches = _.filter session.matches, (match) -> match.date >= getTimeFromDaysAgo now, daysAgo
|
matches = _.filter session.matches, (match) -> match.date >= getTimeFromDaysAgo now, daysAgo
|
||||||
defeats = _.filter matches, (match) -> match.metrics.rank is 1 and match.opponents[0].metrics.rank is 0
|
defeats = _.filter matches, (match) -> match.metrics.rank is 1 and match.opponents[0].metrics.rank is 0
|
||||||
victories = _.filter matches, (match) -> match.metrics.rank is 0 and match.opponents[0].metrics.rank is 1
|
victories = _.filter matches, (match) -> match.metrics.rank is 0 and match.opponents[0].metrics.rank is 1
|
||||||
#ties = _.filter matches, (match) -> match.metrics.rank is 0 and match.opponents[0].metrics.rank is 0
|
|
||||||
defeat = _.last defeats
|
defeat = _.last defeats
|
||||||
victory = _.last victories
|
victory = _.last victories
|
||||||
|
|
||||||
#log.info "#{user.name} had #{matches.length} matches from last #{daysAgo} days out of #{session.matches.length} total matches. #{defeats.length} defeats, #{victories.length} victories, and #{ties.length} ties."
|
|
||||||
#matchInfos = ("\t#{match.date}\t#{match.date >= getTimeFromDaysAgo(now, daysAgo)}\t#{match.metrics.rank}\t#{match.opponents[0].metrics.rank}" for match in session.matches)
|
|
||||||
#log.info "Matches:\n#{matchInfos.join('\n')}"
|
|
||||||
|
|
||||||
sendEmail = (defeatContext, victoryContext) ->
|
sendEmail = (defeatContext, victoryContext) ->
|
||||||
# TODO: do something with the preferredLanguage?
|
# TODO: do something with the preferredLanguage?
|
||||||
context =
|
context =
|
||||||
|
@ -174,7 +153,6 @@ getScoreHistoryGraphURL = (session, daysAgo) ->
|
||||||
|
|
||||||
handleMailchimpWebHook = (req, res) ->
|
handleMailchimpWebHook = (req, res) ->
|
||||||
post = req.body
|
post = req.body
|
||||||
#badLog("Got post data: #{JSON.stringify(post, null, '\t')}")
|
|
||||||
|
|
||||||
unless post.type in ['unsubscribe', 'profile']
|
unless post.type in ['unsubscribe', 'profile']
|
||||||
res.send 'Bad post type'
|
res.send 'Bad post type'
|
||||||
|
@ -213,11 +191,8 @@ module.exports.handleProfileUpdate = handleProfileUpdate = (user, post) ->
|
||||||
user.set 'mailChimp.email', post.data.email
|
user.set 'mailChimp.email', post.data.email
|
||||||
user.set 'mailChimp.euid', post.data.id
|
user.set 'mailChimp.euid', post.data.id
|
||||||
|
|
||||||
# badLog("Updating user object to: #{JSON.stringify(user.toObject(), null, '\t')}")
|
|
||||||
|
|
||||||
module.exports.handleUnsubscribe = handleUnsubscribe = (user) ->
|
module.exports.handleUnsubscribe = handleUnsubscribe = (user) ->
|
||||||
user.set 'emailSubscriptions', []
|
user.set 'emailSubscriptions', []
|
||||||
for emailGroup in mail.NEWS_GROUPS
|
for emailGroup in mail.NEWS_GROUPS
|
||||||
user.setEmailSubscription emailGroup, false
|
user.setEmailSubscription emailGroup, false
|
||||||
|
|
||||||
# badLog("Unsubscribing user object to: #{JSON.stringify(user.toObject(), null, '\t')}")
|
|
||||||
|
|
|
@ -221,6 +221,8 @@ UserHandler = class UserHandler extends Handler
|
||||||
photoURL = document?.get('photoURL')
|
photoURL = document?.get('photoURL')
|
||||||
if photoURL
|
if photoURL
|
||||||
photoURL = "/file/#{photoURL}"
|
photoURL = "/file/#{photoURL}"
|
||||||
|
else if req.query.employerPageAvatar is "true"
|
||||||
|
photoURL = @buildGravatarURL document, req.query.s, "/images/pages/employer/anon_user.png"
|
||||||
else
|
else
|
||||||
photoURL = @buildGravatarURL document, req.query.s, req.query.fallback
|
photoURL = @buildGravatarURL document, req.query.s, req.query.fallback
|
||||||
res.redirect photoURL
|
res.redirect photoURL
|
||||||
|
|
Reference in a new issue