diff --git a/app/lib/Router.coffee b/app/lib/Router.coffee index 357c56ddc..02d7432b9 100644 --- a/app/lib/Router.coffee +++ b/app/lib/Router.coffee @@ -44,7 +44,7 @@ module.exports = class CocoRouter extends Backbone.Router return @openRoute(args.join('/')) view = new ViewClass({}, slugOrId) view.render() - if view then @openView(view) else @showNotFound() + @openView if view then view else @notFoundView() cache: {} openRoute: (route) -> @@ -99,7 +99,7 @@ module.exports = class CocoRouter extends Backbone.Router return document.location.reload() path = "views/#{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.render() @openView(view) @@ -117,7 +117,7 @@ module.exports = class CocoRouter extends Backbone.Router break if ViewClass split -= 1 - return @showNotFound() if not ViewClass + return @notFoundView() if not ViewClass args = pieces[split+1..] view = new ViewClass({}, args...) # options, then any path fragment args view.render() @@ -129,7 +129,7 @@ module.exports = class CocoRouter extends Backbone.Router if error.toString().search('Cannot find module "' + path + '" from') is -1 throw error - showNotFound: -> + notFoundView: -> NotFoundView = require('views/not_found') view = new NotFoundView() view.render() diff --git a/app/lib/auth.coffee b/app/lib/auth.coffee index b19fbc668..6d218608d 100644 --- a/app/lib/auth.coffee +++ b/app/lib/auth.coffee @@ -12,7 +12,7 @@ init = -> me.set 'testGroupNumber', Math.floor(Math.random() * 256) 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) -> user = new User(userObject) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 7094f735e..5653c44c2 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -236,7 +236,7 @@ basics_country: "Country" basics_country_help: "Country you want to work in (or live in now)." 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_full_time: "Full-time" basics_looking_for_part_time: "Part-time" diff --git a/app/locale/pt-PT.coffee b/app/locale/pt-PT.coffee index 82293b01e..70e69d186 100644 --- a/app/locale/pt-PT.coffee +++ b/app/locale/pt-PT.coffee @@ -3,37 +3,37 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P loading: "A carregar..." saving: "A guardar..." sending: "A enviar..." -# send: "Send" + send: "Enviar" cancel: "Cancelar" save: "Guardar" -# publish: "Publish" - create: "Create" + publish: "Publicar" + create: "Criar" delay_1_sec: "1 segundo" delay_3_sec: "3 segundos" delay_5_sec: "5 segundos" manual: "Manual" - fork: "Fork" +# fork: "Fork" play: "Jogar" -# retry: "Retry" -# watch: "Watch" -# unwatch: "Unwatch" -# submit_patch: "Submit Patch" + retry: "Tentar novamente" +# watch: "Watch" +# unwatch: "Unwatch" + submit_patch: "Submeter Versão" -# units: -# second: "second" -# seconds: "seconds" -# minute: "minute" -# minutes: "minutes" -# hour: "hour" -# hours: "hours" -# day: "day" -# days: "days" -# week: "week" -# weeks: "weeks" -# month: "month" -# months: "months" -# year: "year" -# years: "years" + units: + second: "segundo" + seconds: "segundos" + minute: "minuto" + minutes: "minutos" + hour: "hora" + hours: "horas" + day: "dia" + days: "dias" + week: "semana" + weeks: "semanas" + month: "mês" + months: "meses" + year: "ano" + years: "anos" modal: close: "Fechar" @@ -43,88 +43,88 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P page_not_found: "Página não encontrada" nav: - play: "Jogar" -# community: "Community" + play: "Níveis" + community: "Comunidade" editor: "Editor" blog: "Blog" forum: "Fórum" -# account: "Account" + account: "Conta" admin: "Administrador" home: "Início" contribute: "Contribuir" legal: "Legal" about: "Sobre" - contact: "Contacto" + contact: "Contacte" twitter_follow: "Seguir" - employers: "Patrões" + employers: "Empregadores" versions: save_version_title: "Guardar Nova Versão" 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_suffix: "." cla_agree: "EU CONCORDO" login: - sign_up: "Criar conta" - log_in: "Iniciar sessão" -# logging_in: "Logging In" + sign_up: "Criar Conta" + log_in: "Iniciar Sessão" + logging_in: "A Iniciar Sessão" log_out: "Sair" recover: "recuperar conta" recover: - recover_account_title: "Recuperar conta" - send_password: "Recuperar password" + recover_account_title: "Recuperar Conta" + send_password: "Enviar Password de Recuperação" signup: - create_account_title: "Cria uma conta para guardar o teu progresso." - description: "É grátis. Só precisamos de umas coisas e fica tudo pronto:" + create_account_title: "Criar Conta para Guardar Progresso" + description: "É grátis. Só são necessárias umas coisas e fica tudo pronto:" email_announcements: "Receber anúncios por e-mail" coppa: "13+ ou não-EUA " coppa_why: "(Porquê?)" - creating: "A criar conta..." + creating: "A Criar Conta..." sign_up: "Registar" log_in: "iniciar sessão com palavra-passe" -# social_signup: "Or, you can sign up through Facebook or G+:" -# required: "You need to log in before you can go that way." + social_signup: "Ou pode registar-se através do Facebook ou do Google+:" + required: "Precisa de iniciar sessão antes de prosseguir dessa forma." home: - slogan: "Aprende a Programar ao Jogar um Jogo" - no_ie: "O CodeCombat não corre em Internet Explorer 9 ou anterior. Desculpa!" - no_mobile: "O CodeCombat não foi desenhado para dispositivos móveis e pode não funcionar!" + slogan: "Aprenda a Programar ao Jogar um Jogo" + no_ie: "O CodeCombat não funciona no Internet Explorer 9 ou anterior. Desculpe!" + no_mobile: "O CodeCombat não foi feito para dispositivos móveis e pode não funcionar!" play: "Jogar" - old_browser: "Ups, o teu browser é demasiado antigo para correr o CodeCombat. Desculpa!" - old_browser_suffix: "Mesmo assim podes tentar, mas provavelmente não vai funcionar." + old_browser: "Ups, o seu navegador é demasiado antigo para que o CodeCombat funcione. Desculpe!" + old_browser_suffix: "Mesmo assim pode tentar, mas provavelmente não irá funcionar." campaign: "Campanha" for_beginners: "Para Iniciantes" - multiplayer: "Multiplayer" + multiplayer: "Multijogador" for_developers: "Para Programadores" play: - choose_your_level: "Escolhe o Teu Nível" - adventurer_prefix: "Podes saltar para um dos níveis abaixo, ou discutir os níveis " - adventurer_forum: "no fórum de Aventureiro" + choose_your_level: "Escolha o Seu Nível" + adventurer_prefix: "Pode saltar para um dos níveis abaixo ou discutir os níveis no " + adventurer_forum: "fórum do Aventureiro" adventurer_suffix: "." campaign_beginner: "Campanha para Iniciantes" - campaign_beginner_description: "... onde aprendes a feitiçaria da programação." - campaign_dev: "Níveis mais Difíceis" - campaign_dev_description: "... onde aprendes a interface enquanto fazes coisas um bocadinho mais difíceis." + campaign_beginner_description: "... onde aprende a feitiçaria da programação." + campaign_dev: "Níveis mais Difíceis Aleatórios" + campaign_dev_description: "... onde aprende a interface enquanto faz coisas um bocadinho mais difíceis." 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_description: "... onde combates contra a criatividade dos teus colegas Feiticeiros Artesãos." + campaign_player_created_description: "... onde combate contra a criatividade dos seus colegas Feiticeiros Artesãos." level_difficulty: "Dificuldade: " - play_as: "Jogar como " - spectate: "Observar" + play_as: "Jogar Como" + spectate: "Espectar" contact: - contact_us: "Contactar o CodeCombat" - welcome: "É bom ter notícias tuas! Usa este formulário para nos enviares um e-mail." - contribute_prefix: "Se estás interessado em contribuir, dá uma olhadela à nossa " + contact_us: "Contacte o CodeCombat" + welcome: "É bom ter notícias suas! Use este formulário para nos enviar um e-mail. " + contribute_prefix: "Se está interessado em contribuir, dê uma olhadela à nossa " contribute_page: "página de contribuição" 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_suffix: " como alternativa." 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." diplomat_suggestion: - title: "Ajuda a traduzir o CodeCombat!" - sub_heading: "Precisamos das tuas 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." - 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." - learn_more: "Sabe mais sobre ser um Diplomata" - subscribe_as_diplomat: "Subscrever como Diplomata" + title: "Ajude a traduzir o CodeCombat!" + 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 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 conseguirmos traduzir tudo para Português, irá ver em Inglês o que não estiver disponível em Português." + learn_more: "Saiba mais sobre ser um Diplomata" + subscribe_as_diplomat: "Subscreva-se como Diplomata" wizard_settings: - title: "Definições do Wizard" - customize_avatar: "Altera o teu Avatar" -# active: "Active" -# color: "Color" -# group: "Group" + title: "Definições do Feiticeiro" + customize_avatar: "Personalize o Seu Avatar" + active: "Ativo" + color: "Cor" + group: "Grupo" clothes: "Roupas" trim: "Pormenores" cloud: "Nuvem" -# team: "Team" + team: "Equipa" spell: "Feitiço" boots: "Botas" - hue: "Matiz" + hue: "Tom" saturation: "Saturação" lightness: "Brilho" account_settings: title: "Definições da Conta" - not_logged_in: "Inicia sessão ou cria uma conta para alterares as tuas definições." - autosave: "As alterações guardam-se automaticamente" + not_logged_in: "Inicie sessão ou crie uma conta para alterar as suas definições." + autosave: "Alterações Guardam Automaticamente" me_tab: "Eu" picture_tab: "Fotografia" -# upload_picture: "Upload a picture" + upload_picture: "Anexar uma fotografia" wizard_tab: "Feiticeiro" password_tab: "Palavra-passe" emails_tab: "E-mails" - admin: "Admin" - wizard_color: "Cor das roupas do feiticeiro" - new_password: "Nova palavra-passe" + admin: "Administrador" + wizard_color: "Cor das Roupas do Feiticeiro" + new_password: "Nova Palavra-passe" new_password_verify: "Verificar" email_subscriptions: "Subscrições de E-mail" 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_summary: "Controls for personalized, automatic email notifications related to your CodeCombat activity." -# email_any_notes: "Any Notifications" -# email_any_notes_description: "Disable to stop all activity notification emails." -# email_recruit_notes: "Job Opportunities" -# email_recruit_notes_description: "If you play really well, we may contact you about getting you a (better) job." - contributor_emails: "E-mails para Contribuintes" + email_any_notes: "Quaisquer Notificações" + email_any_notes_description: "Desative para parar de receber todos os e-mails de notificação de atividade." + email_recruit_notes: "Oportunidades de Emprego" + email_recruit_notes_description: "Se joga muito bem, podemos contactá-lo para lhe arranjar um (melhor) emprego." + contributor_emails: "Subscrições de E-mail (Contribuintes)" contribute_prefix: "Estamos à procura de pessoas para se juntarem a nós! Visita a " contribute_page: "página de contribuição" - contribute_suffix: " para mais informação." - email_toggle: "Alternar todos" - error_saving: "Erro ao guardar" - saved: "Alterações guardadas" + contribute_suffix: " para mais informações." + email_toggle: "Alternar Todos" + error_saving: "Erro ao Guardar" + saved: "Alterações Guardadas" password_mismatch: "As palavras-passe não coincidem." -# job_profile: "Job Profile" -# 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_explanation: "Hi! Fill this out, and we will get in touch about finding you a software developer job." -# sample_profile: "See a sample profile" -# view_profile: "View Your Profile" + job_profile: "Perfil de Emprego" + 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: "Olá! Preencha isto e entraremos em contacto consigo sobre encontrar um emprego de desenvolvedor de software para si." + sample_profile: "Veja um exemplo de perfil" + view_profile: "Veja o Seu Perfil" account_profile: -# settings: "Settings" -# edit_profile: "Edit Profile" -# done_editing: "Done Editing" - profile_for_prefix: "Perfil de " + settings: "Definições" + edit_profile: "Editar Perfil" + done_editing: "Concluir a Edição" + profile_for_prefix: "Perfil para " profile_for_suffix: "" # featured: "Featured" # not_featured: "Not Featured" @@ -282,6 +282,7 @@ module.exports = nativeDescription: "Português europeu", englishDescription: "P # education_description: "Description" # education_description_help: "Highlight anything about this educational experience. (140 chars; optional)" # our_notes: "Our Notes" +# remarks: "Remarks" # projects: "Projects" # projects_header: "Add 3 projects" # 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." # player_code: "Player Code" -# employers: -# want_to_hire_our_players: "Hire CodeCombat Players" -# what: "What is CodeCombat?" + employers: + want_to_hire_our_players: "Contratar Jogadores do 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." -# 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." -# 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." -# 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 " +# 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_3: ", has " # why_blurb_4: "demonstrated top notch technical skills" # why_blurb_5: ", and has been " # why_blurb_6: "personally screened by us" # why_blurb_7: ". Stop screening and start hiring." -# see_candidates: "Click here to see our candidates" -# candidate_name: "Name" -# candidate_location: "Location" -# candidate_looking_for: "Looking For" -# candidate_role: "Role" -# candidate_top_skills: "Top Skills" -# candidate_years_experience: "Yrs Exp" -# candidate_last_updated: "Last Updated" -# featured_developers: "Featured Developers" -# other_developers: "Other Developers" -# inactive_developers: "Inactive Developers" + see_candidates: "Clique aqui para ver os nossos candidatos" + candidate_name: "Nome" + candidate_location: "Localização" + candidate_looking_for: "À Procura de" + candidate_role: "Cargo" + candidate_top_skills: "Principais Habilidades" + candidate_years_experience: "Anos de Experiência" + candidate_last_updated: "Última Vez Atualizado" + candidate_who: "Quem" + featured_developers: "Desenvolvedores em Destaque" + other_developers: "Outros Desenvolvedores" + inactive_developers: "Desenvolvedores Inativos" play_level: done: "Concluir" diff --git a/app/schemas/models/user.coffee b/app/schemas/models/user.coffee index b85d9f2bd..2c4a0b8eb 100644 --- a/app/schemas/models/user.coffee +++ b/app/schemas/models/user.coffee @@ -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?'} 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!'} - 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.'}, c.object {title: 'Job', description: 'Some work experience you had.', required: ['employer', 'role', 'duration']}, employer: c.shortString {title: 'Employer', description: 'Name of your employer.'} @@ -142,11 +142,11 @@ UserSchema = c.object {}, roleFilter: title: 'Role' type: 'string' - enum: ['Web Developer', 'Software Developer', 'iOS Developer', 'Android Developer', 'Project Manager'] + enum: ['Web Developer', 'Software Developer', 'iOS Developer', 'Android Developer', 'Mobile Developer'] seniorityFilter: title: 'Seniority' type: 'string' - enum: ['College Student', 'Recent Grad', 'Junior', 'Senior', 'Management'] + enum: ['College Student', 'Recent Grad', 'Junior', 'Senior'] featured: title: 'Featured' type: 'boolean' diff --git a/app/styles/account/wizard-settings.sass b/app/styles/account/wizard-settings.sass index 83ca4f2ce..9a93d6613 100644 --- a/app/styles/account/wizard-settings.sass +++ b/app/styles/account/wizard-settings.sass @@ -8,9 +8,13 @@ width: 450px margin: 0 auto + label + cursor: pointer + #color-settings table float: left width: 250px + cursor: pointer .minicolors-input display: none diff --git a/app/styles/employers.sass b/app/styles/employers.sass index c9f519ce8..c88e1e3c6 100644 --- a/app/styles/employers.sass +++ b/app/styles/employers.sass @@ -1,6 +1,6 @@ #employers-view - button + .employer-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)) @@ -17,15 +17,24 @@ margin-bottom: 10px .panel-heading background-color: darkgrey + cursor: pointer .panel-body background-color: darkgrey + border-radius: 4px + border-top-left-radius: 0px + border-top-right-radius: 0px + .panel + border: 1px red + border-radius: 0px #filters .filter_section - width: 16% + width: 25% display: inline-block vertical-align: top margin-bottom: 10px + label input + margin-right: 10px .get-started-button vertical-align: text-bottom margin-left: 10px @@ -33,13 +42,13 @@ #filter-button, #create-alert-button float: right - #login-link, #logout-button + #login-link, #logout-link float: right color: #333333 display: inline-block :visited color: #333333 - #logout-button:hover + #logout-link:hover cursor: pointer #tagline, .hiring-call-to-action diff --git a/app/templates/account/profile.jade b/app/templates/account/profile.jade index de9dcca11..c4ef36448 100644 --- a/app/templates/account/profile.jade +++ b/app/templates/account/profile.jade @@ -155,7 +155,7 @@ block content 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='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 label.control-label(data-i18n="account_profile.basics_looking_for") Looking For select.form-control(name='root[lookingFor]') diff --git a/app/templates/account/wizard_settings.jade b/app/templates/account/wizard_settings.jade index f0c95410e..192f758c4 100644 --- a/app/templates/account/wizard_settings.jade +++ b/app/templates/account/wizard_settings.jade @@ -1,5 +1,5 @@ #color-settings - table.table.table-bordered + table.table.table-bordered.table-hover tr th(data-i18n="wizard_settings.active") Active th(data-i18n="wizard_settings.color") Color diff --git a/app/templates/editor/article/edit.jade b/app/templates/editor/article/edit.jade index d61460e60..f882cea08 100644 --- a/app/templates/editor/article/edit.jade +++ b/app/templates/editor/article/edit.jade @@ -23,6 +23,9 @@ block content #article-view + h3 Patches + .patches-view + hr div#error-view diff --git a/app/templates/employers.jade b/app/templates/employers.jade index 790058be5..38e9f2852 100644 --- a/app/templates/employers.jade +++ b/app/templates/employers.jade @@ -7,10 +7,10 @@ block content if !isEmployer && !me.isAdmin() #tagline 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 if !me.get('anonymous') - a#logout-button(data-i18n="login.log_out") Logout + a#logout-link(data-i18n="login.log_out") Logout br #filter .panel-group#filter_panel @@ -24,78 +24,66 @@ block content .panel-collapse.collapse.in#collapseOne .panel-body form#filters - .filter_section#screened_filter - h4 Screened - 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 + label + 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 + label + 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. + label + input(type="checkbox" name="schoolFilter" value="Top 20 Eng.") + | Top 20 Eng. br - input(type="checkbox" name="schoolFilter" value="Other US") - | Other US + label + 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 + label + input(type="checkbox" name="schoolFilter" value="Other Intl.") + | Other Intl. .filter_section#role_filter h4 Role - input(type="checkbox" name="roleFilter" value="Web Developer") - | Web Developer + label + input(type="checkbox" name="roleFilter" value="Web Developer") + | Web Developer br - input(type="checkbox" name="roleFilter" value="Software Developer") - | Software Developer + label + input(type="checkbox" name="roleFilter" value="Software Developer") + | Software Developer br - input(type="checkbox" name="roleFilter" value="iOS Developer") - | iOS Developer + label + 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 + label + input(type="checkbox" name="roleFilter" value="Android Developer") + | Android Developer .filter_section#seniority_filter h4 Seniority - input(type="checkbox" name="seniorityFilter" value="College Student") - | College Student + label + input(type="checkbox" name="seniorityFilter" value="Senior") + | Senior br - input(type="checkbox" name="seniorityFilter" value="Recent Grad") - | Recent Grad + label + input(type="checkbox" name="seniorityFilter" value="Junior") + | Junior br - input(type="checkbox" name="seniorityFilter" value="Junior") - | Junior + label + input(type="checkbox" name="seniorityFilter" value="Recent Grad") + | Recent Grad br - input(type="checkbox" name="seniorityFilter" value="Senior") - | Senior - br - input(type="checkbox" name="seniorityFilter" value="Management") - | Management + label + input(type="checkbox" name="seniorityFilter" value="College Student") + | College Student + //input#select_all_checkbox(type="checkbox" name="select_all" checked) //| Select all - button.btn#filter-button Filter + button.btn.employer-button#filter-button Filter p#results #{numberOfCandidates} results //button.btn#create-alert-button Create Alert if candidates.length @@ -108,11 +96,15 @@ block content - 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) + td(rowspan=3) .candidate-picture img(src=candidate.getPhotoURL(50,false,true), alt=profile.name, title=profile.name, width=50) + td + strong + | #{profile.name} + tr.description_row(data-candidate-id=candidate.id) if curated && curated.shortDescription td.candidate-description #{curated.shortDescription} else @@ -122,7 +114,7 @@ block content - var workHistory = curated.workHistory.join(","); td.tag_column img(src="/images/pages/employer/tag.png") - | #{curated.mainTag} + | #{profile.jobTitle} td.location_column img(src="/images/pages/employer/location.png") | #{curated.location} @@ -133,14 +125,13 @@ block content if workHistory img(src="/images/pages/employer/briefcase.png") | #{workHistory} - else - td Hi + if !isEmployer && !me.isAdmin() div#info_wrapper span.hiring-call-to-action 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: .reasons#top_row @@ -162,7 +153,7 @@ block content 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 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 .reason_long img.employer_icon(src="/images/pages/employer/employer_icon1.png") diff --git a/app/templates/modal/wizard_settings.jade b/app/templates/modal/wizard_settings.jade index a301884ec..ea22506ec 100644 --- a/app/templates/modal/wizard_settings.jade +++ b/app/templates/modal/wizard_settings.jade @@ -17,4 +17,4 @@ block modal-body-wait-content .progress-bar 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 diff --git a/app/views/account/wizard_settings_view.coffee b/app/views/account/wizard_settings_view.coffee index 6e441654f..0c014fa22 100644 --- a/app/views/account/wizard_settings_view.coffee +++ b/app/views/account/wizard_settings_view.coffee @@ -11,6 +11,11 @@ module.exports = class WizardSettingsView extends CocoView startsLoading: true 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) -> colorGroup = $(e.target).closest('.color-group') @updateColorSettings(colorGroup) diff --git a/app/views/editor/article/edit.coffee b/app/views/editor/article/edit.coffee index 1511ba155..ae9083a2a 100644 --- a/app/views/editor/article/edit.coffee +++ b/app/views/editor/article/edit.coffee @@ -1,9 +1,9 @@ View = require 'views/kinds/RootView' VersionHistoryView = require './versions_view' -ErrorView = require '../../error_view' template = require 'templates/editor/article/edit' Article = require 'models/Article' SaveVersionModal = require 'views/modal/save_version_modal' +PatchesView = require 'views/editor/patches_view' module.exports = class ArticleEditView extends View id: 'editor-article-edit-view' @@ -37,7 +37,7 @@ module.exports = class ArticleEditView extends View @article.fetch() @listenToOnce(@article, 'sync', @buildTreema) @pushChangesToPreview = _.throttle(@pushChangesToPreview, 500) - + buildTreema: -> return if @treema? or (not @article.loaded) unless @article.attributes.body @@ -68,13 +68,15 @@ module.exports = class ArticleEditView extends View getRenderData: (context={}) -> context = super(context) context.article = @article - context.authorized = me.isAdmin() or @article.hasWriteAccess(me) + context.authorized = not me.get('anonymous') context afterRender: -> super() return if @startsLoading @showReadOnly() if me.get('anonymous') + @patchesView = @insertSubView(new PatchesView(@article), @$el.find('.patches-view')) + @patchesView.load() openPreview: -> @preview = window.open('/editor/article/x/preview', 'preview', 'height=800,width=600') diff --git a/app/views/editor/thang/edit.coffee b/app/views/editor/thang/edit.coffee index 39fe787ba..3f6e624ce 100644 --- a/app/views/editor/thang/edit.coffee +++ b/app/views/editor/thang/edit.coffee @@ -58,7 +58,7 @@ module.exports = class ThangTypeEditView extends View context = super(context) context.thangType = @thangType context.animations = @getAnimationNames() - context.authorized = me.isAdmin() or @thangType.hasWriteAccess(me) + context.authorized = not me.get('anonymous') context getAnimationNames: -> @@ -350,7 +350,7 @@ module.exports = class ThangTypeEditView extends View schema: schema files: @files filePath: "db/thang.type/#{@thangType.get('original')}" - readOnly: true unless me.isAdmin() or @thangType.hasWriteAccess(me) + readOnly: me.get('anonymous') callbacks: change: @pushChangesToPreview select: @onSelectNode diff --git a/app/views/employers_view.coffee b/app/views/employers_view.coffee index 5b7bd2710..9c236a398 100644 --- a/app/views/employers_view.coffee +++ b/app/views/employers_view.coffee @@ -21,6 +21,7 @@ module.exports = class EmployersView extends View events: 'click tbody tr': 'onCandidateClicked' + 'click #logout-link': 'logoutAccount' 'change #filters input': 'onFilterChanged' 'click #filter-button': 'applyFilters' 'change #select_all_checkbox': 'handleSelectAllChange' @@ -121,13 +122,18 @@ module.exports = class EmployersView extends View getRenderData: -> ctx = super() ctx.isEmployer = @isEmployer() - ctx.candidates = _.sortBy @candidates.models, (c) -> -1 * c.get('jobProfile').experience + ctx.candidates = _.sortBy @candidates.models, (c) -> c.get('jobProfile').curated?.featured + ctx.candidates = _.sortBy ctx.candidates, (c) -> -1 * c.get('jobProfile').experience + ctx.candidates = _.sortBy ctx.candidates, (c) -> not c.get('jobProfile').curated? ctx.activeCandidates = _.filter 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') + unless @isEmployer() or me.isAdmin() ctx.featuredCandidates = _.filter ctx.featuredCandidates, (c) -> c.get('jobProfile').curated ctx.featuredCandidates = ctx.featuredCandidates.slice(0,7) + if me.isAdmin() + ctx.featuredCandidates = ctx.candidates ctx.otherCandidates = _.reject ctx.activeCandidates, (c) -> c.get('jobProfileApproved') ctx.remarks = {} ctx.remarks[remark.get('user')] = remark for remark in @remarks.models diff --git a/app/views/kinds/CocoView.coffee b/app/views/kinds/CocoView.coffee index 541d02657..21b432dd7 100644 --- a/app/views/kinds/CocoView.coffee +++ b/app/views/kinds/CocoView.coffee @@ -137,12 +137,14 @@ module.exports = class CocoView extends Backbone.View resourceIndex: r.rid, responseText: r.jqxhr?.responseText })).i18n() + @$el.find('.progress').hide() onRetryResource: (e) -> res = @supermodel.getResource($(e.target).data('resource-index')) # different views may respond to this call, and not all have the resource to reload return unless res and res.isFailed res.load() + @$el.find('.progress').show() $(e.target).closest('.loading-error-alert').remove() # Modals diff --git a/app/views/play/level/gold_view.coffee b/app/views/play/level/gold_view.coffee index f7168b386..42ef28572 100644 --- a/app/views/play/level/gold_view.coffee +++ b/app/views/play/level/gold_view.coffee @@ -15,7 +15,7 @@ module.exports = class GoldView extends View @teamGold = {} @teamGoldEarned = {} @shownOnce = false - + onGoldChanged: (e) -> return if @teamGold[e.team] is e.gold and @teamGoldEarned[e.team] is e.goldEarned @teamGold[e.team] = e.gold @@ -24,7 +24,7 @@ module.exports = class GoldView extends View unless goldEl.length teamEl = teamTemplate team: e.team @$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 if e.goldEarned and e.goldEarned > e.gold text += " (#{e.goldEarned})" @@ -34,7 +34,13 @@ module.exports = class GoldView extends View @shownOnce = true 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) -> @$el.toggle not e.on if @shownOnce diff --git a/app/views/play/level_view.coffee b/app/views/play/level_view.coffee index 88b6955e6..008dfba23 100644 --- a/app/views/play/level_view.coffee +++ b/app/views/play/level_view.coffee @@ -274,6 +274,7 @@ module.exports = class PlayLevelView extends View # Once Surface is Loaded #################################################### onLevelStarted: -> + return unless @surface? @loadingView.showReady() if window.currentModal and not window.currentModal.destroyed return Backbone.Mediator.subscribeOnce 'modal-closed', @onLevelStarted, @ diff --git a/bower.json b/bower.json index beb943ad0..357b9d431 100644 --- a/bower.json +++ b/bower.json @@ -32,7 +32,7 @@ "firepad": "~0.1.2", "marked": "~0.3.0", "moment": "~2.5.0", - "aether": "~0.2.9", + "aether": "~0.2.22", "underscore.string": "~2.3.3", "firebase": "~1.0.2", "catiline": "~2.9.3", diff --git a/package.json b/package.json index 32568f23e..cba6e383e 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "redis": "", "webworker-threads": "~0.4.11", "node-gyp": "~0.13.0", - "aether": "~0.2.9", + "aether": "~0.2.22", "JASON": "~0.1.3", "JQDeferred": "~2.1.0" }, diff --git a/server/levels/components/level_component_handler.coffee b/server/levels/components/level_component_handler.coffee index 810fa3e86..889619d8d 100644 --- a/server/levels/components/level_component_handler.coffee +++ b/server/levels/components/level_component_handler.coffee @@ -22,7 +22,7 @@ LevelComponentHandler = class LevelComponentHandler extends Handler props hasAccess: (req) -> - req.method is 'GET' or req.user?.isAdmin() + req.method in ['GET', 'PUT'] or req.user?.isAdmin() module.exports = new LevelComponentHandler()