Added some i18n and improved employer page.

This commit is contained in:
Nick Winter 2014-04-11 12:49:44 -07:00
parent ca13324e99
commit ae65f07e7e
10 changed files with 93 additions and 69 deletions

View file

@ -116,7 +116,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
forum_suffix: " instead." forum_suffix: " instead."
send: "Send Feedback" send: "Send Feedback"
contact_candidate: "Contact Candidate" contact_candidate: "Contact Candidate"
recruitment_reminder: "Use this form to get in touch with candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary for any full-time candidate you hire who stays 90 days, but that part-timers, remote employees, contractors, and interns are free." recruitment_reminder: "Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% 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: "Help translate CodeCombat!" title: "Help translate CodeCombat!"
@ -151,6 +151,7 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
wizard_tab: "Wizard" wizard_tab: "Wizard"
password_tab: "Password" password_tab: "Password"
emails_tab: "Emails" emails_tab: "Emails"
job_profile_tab: "Job Profile!!!"
admin: "Admin" admin: "Admin"
wizard_color: "Wizard Clothes Color" wizard_color: "Wizard Clothes Color"
new_password: "New Password" new_password: "New Password"
@ -168,11 +169,37 @@ module.exports = nativeDescription: "English", englishDescription: "English", tr
error_saving: "Error Saving" error_saving: "Error Saving"
saved: "Changes Saved" saved: "Changes Saved"
password_mismatch: "Password does not match." password_mismatch: "Password does not match."
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.!!!"
account_profile: account_profile:
edit_settings: "Edit Settings" edit_settings: "Edit Settings!!!"
profile_for_prefix: "Profile for " profile_for_prefix: "Profile for !!!"
profile_for_suffix: "" profile_for_suffix: "!!!"
approved: "Approved!!!"
not_approved: "Not Approved!!!"
looking_for: "Looking for:!!!"
last_updated: "Last updated:!!!"
contact: "Contact!!!"
work_experience: "Work Experience!!!"
education: "Education!!!"
our_notes: "Our Notes!!!"
projects: "Projects!!!"
employers:
want_to_hire_our_players: "Want to hire expert CodeCombat players?"
contact_george: "Contact George to see our candidates"
candidates_count_prefix: "We currently have "
candidates_count_many: "many"
candidates_count_suffix: "highly skilled and vetted developers looking for work."
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"
play_level: play_level:
level_load_error: "Level could not be loaded: " level_load_error: "Level could not be loaded: "

View file

@ -7,6 +7,10 @@
cursor: pointer cursor: pointer
&:hover &:hover
color: black color: black
&:first-child
// Make sure that "Developer #56" doesn't wrap onto second row
min-width: 110px
.tablesorter-headerAsc .tablesorter-headerAsc
background-color: #cfc background-color: #cfc
@ -16,3 +20,10 @@
tr tr
cursor: pointer cursor: pointer
code
background-color: rgb(220, 220, 220)
color: #555
margin: 2px 0
display: inline-block
text-transform: lowercase

View file

@ -1,8 +1,8 @@
h3(data-i18n="account_settings.job_profile") Job Profile h3(data-i18n="account_settings.job_profile") Job Profile
if me.get('jobProfileApproved') if me.get('jobProfileApproved')
p.lead(data-i18n="account_settings.job_profile_approved") Your job profile has been approved by CodeCombat. Hungry employers will see it until you mark it inactive or it is stale for two months. p.lead(data-i18n="account_settings.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.
else else
p.lead(data-i18n="account_settings.job_profile_explanation") Hi! Fill this out, and if we think we can find you a software developer job, we will get in touch to approve your profile. p.lead(data-i18n="account_settings.job_profile_explanation") Hi! Fill this out, and we will get in touch about finding you a software developer job.
#job-profile-treema #job-profile-treema

View file

@ -36,10 +36,16 @@ block content
div= profile.city + ', ' + profile.country div= profile.city + ', ' + profile.country
div= profile.visa div= profile.visa
div Looking for: #{profile.lookingFor} div
div Last updated #{moment(profile.updated).fromNow()} span(data-i18n="account_profile.looking_for") Looking for:
| #{profile.lookingFor}
div
span(data-i18n="account_profile.last_updated") Last updated:
| #{moment(profile.updated).fromNow()}
button#contact-candidate.btn.btn-large.btn-inverse.flat-button Contact #{profile.name.split(' ')[0]} button#contact-candidate.btn.btn-large.btn-inverse.flat-button
span(data-i18n="account_profile.contact") Contact
| #{profile.name.split(' ')[0]}
.middle-column.full-height-column .middle-column.full-height-column
h3= profile.name h3= profile.name
@ -53,7 +59,7 @@ block content
if profile.work.length if profile.work.length
h3.experience-header h3.experience-header
img.header-icon(src="/images/pages/account/profile/work.png", alt="") img.header-icon(src="/images/pages/account/profile/work.png", alt="")
| Work Experience span(data-i18n="account_profile.work_experience") Work Experience
each job in profile.work each job in profile.work
div.duration.pull-right= job.duration div.duration.pull-right= job.duration
| #{job.role} at #{job.employer} | #{job.role} at #{job.employer}
@ -62,14 +68,14 @@ block content
if profile.education.length if profile.education.length
h3.experience-header h3.experience-header
img.header-icon(src="/images/pages/account/profile/education.png", alt="") img.header-icon(src="/images/pages/account/profile/education.png", alt="")
| Education span(data-i18n="account_profile.work_experience") Education
each school in profile.education each school in profile.education
div.duration.pull-right= school.duration div.duration.pull-right= school.duration
| #{school.degree} at #{school.school} | #{school.degree} at #{school.school}
.clearfix .clearfix
if user.get('jobProfileNotes') || me.isAdmin() if user.get('jobProfileNotes') || me.isAdmin()
h3.experience-header Our Notes h3.experience-header(data-i18n="account_profile.our_notes") Our Notes
- var notes = user.get('jobProfileNotes') || ''; - var notes = user.get('jobProfileNotes') || '';
if me.isAdmin() if me.isAdmin()
textarea#job-profile-notes!= notes textarea#job-profile-notes!= notes
@ -78,7 +84,7 @@ block content
.right-column.full-height-column .right-column.full-height-column
if profile.projects.length if profile.projects.length
h3 Projects h3(data-i18n="account_profile.projects") Projects
ul.projects ul.projects
each project in profile.projects each project in profile.projects
li li
@ -97,4 +103,4 @@ block content
img.profile-photo(src=user.getPhotoURL(256)) img.profile-photo(src=user.getPhotoURL(256))
h2 TODO h2 TODO
p Public user profiles are not ready yet. p Public user profiles are not ready yet. If you are seeing this, we probably have a bug leading to a broken link.

View file

@ -2,48 +2,30 @@ extends /templates/base
block content block content
.row h1(data-i18n="employers.want_to_hire_our_players") Want to hire expert CodeCombat players?
.col-md-6 p
span(data-i18n="employers.candidates_count_prefix") We currently have
h2 CodeCombat for Employers if candidates.length
| #{candidates.length}
p.lead Want to hire expert CodeCombat players? else
span(data-i18n="employers.candidates_count_many") many
p |
| CodeCombat doesn't just have beginners. We also have expert software developers who play our span(data-i18n="employers.candidates_count_suffix") highly skilled and vetted developers looking for work.
a(href="http://blog.codecombat.com/beat-this-level-get-a-programming-job") developer challenge levels h3
| . If your company is seeking technical talent, then we'd be happy to help place candidates with you. a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/employer_signup", data-i18n="employers.contact_george") Contact George to see our candidates
p We were actually overwhelmed by how many talented developers rushed to site, crushed our version of the algorithm in the Gridmancer challenge, and were looking for job opportunities, especially in the SF Bay Area where CodeCombat is located. So if you're an employer, now's a great time to get in touch and meet some amazing programmers.
p If this sounds interesting, then let's get in touch, find out what you're looking for, talk about recruitment terms, and see what we can do for you. Don't worrywe are not your traditional recruiter. We're a tech company like you who happens to have a ton of great programmers looking to us for help with the job search.
h3
a(title='Contact', tabindex=-1, data-toggle="coco-modal", data-target="modal/contact") Contact Us
.span5
h2 Candidate Statistics
h4 Resumes: 46
h4 Ages: 16 - 45
h4 Experience: 0 - 30 years
h4 Skill: from interns and entry level to senior developers and management
h4 Technologies: just about everything
h4 Countries: USA, Canada, Australia, and many more
if candidates.length if candidates.length
table.table.table-condensed.table-hover.table-responsive.tablesorter table.table.table-condensed.table-hover.table-responsive.tablesorter
thead thead
tr tr
th Name th(data-i18n="general.name") Name
th Location th(data-i18n="employers.candidate_location") Location
th Looking For th(data-i18n="employers.candidate_looking_for") Looking For
th Top 5 Skills th(data-i18n="employers.candidate_role") Role
th Yrs Exp th(data-i18n="employers.candidate_top_skills") Top Skills
th Last Updated th(data-i18n="employers.candidate_years_experience") Yrs Exp
th Current Job th(data-i18n="employers.candidate_last_updated") Last Updated
if me.isAdmin() if me.isAdmin()
th ✓? th ✓?
@ -64,20 +46,13 @@ block content
else else
td= profile.country td= profile.country
td= profile.lookingFor td= profile.lookingFor
td= profile.jobTitle
td td
each skill in profile.skills.slice(0, 5) each skill in profile.skills.slice(0, 10)
code= skill code= skill
span span
td= profile.experience td= profile.experience
td= moment(profile.updated).fromNow() td= moment(profile.updated).fromNow()
if authorized
if profile.work.length
td= profile.work[0].role + ' at ' + profile.work[0].employer
else
td
else
td
em Employer sign-up required.
if me.isAdmin() if me.isAdmin()
if candidate.get('jobProfileApproved') if candidate.get('jobProfileApproved')
td ✓ td ✓

View file

@ -4,7 +4,7 @@ block modal-header-content
h3(data-i18n="contact.contact_candidate") Contact Candidate h3(data-i18n="contact.contact_candidate") Contact Candidate
block modal-body-content block modal-body-content
p(data-i18n="contact.recruitment_reminder") Use this form to get in touch with candidates you are interested in interviewing. Remember that CodeCombat charges 18% of first-year salary for any full-time candidate you hire who stays 90 days, but that part-timers, remote employees, contractors, and interns are free. p(data-i18n="contact.recruitment_reminder") Use this form to reach out to candidates you are interested in interviewing. Remember that CodeCombat charges 18% 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.
.form .form
.form-group .form-group
label.control-label(for="contact-email", data-i18n="general.email") Email label.control-label(for="contact-email", data-i18n="general.email") Email

View file

@ -3,8 +3,7 @@ template = require 'templates/employers'
app = require 'application' app = require 'application'
User = require 'models/User' User = require 'models/User'
CocoCollection = require 'models/CocoCollection' CocoCollection = require 'models/CocoCollection'
employerSignupTemplate = require 'templates/modal/employer_signup_modal' EmployerSignupView = require 'views/modal/employer_signup_modal'
ModalView = require 'views/kinds/ModalView'
class CandidatesCollection extends CocoCollection class CandidatesCollection extends CocoCollection
url: '/db/user/x/candidates' url: '/db/user/x/candidates'
@ -81,10 +80,8 @@ module.exports = class EmployersView extends View
onCandidateClicked: (e) -> onCandidateClicked: (e) ->
id = $(e.target).closest('tr').data('candidate-id') id = $(e.target).closest('tr').data('candidate-id')
if id if not id
url = "/account/profile/#{id}" url = "/account/profile/#{id}"
app.router.navigate url, {trigger: true} app.router.navigate url, {trigger: true}
else else
employerSignupModal = new ModalView() @openModalView new EmployerSignupView
employerSignupModal.template = employerSignupTemplate
@openModalView employerSignupModal

View file

@ -210,6 +210,7 @@ module.exports = class CocoView extends Backbone.View
return unless elem.data('toggle') is 'coco-modal' return unless elem.data('toggle') is 'coco-modal'
target = elem.data('target') target = elem.data('target')
view = application.router.getView(target, '_modal') # could set up a system for loading cached modals, if told to view = application.router.getView(target, '_modal') # could set up a system for loading cached modals, if told to
console.log "got target", target, "which gave view", view
@openModalView(view) @openModalView(view)
openModalView: (modalView, softly=false) -> openModalView: (modalView, softly=false) ->
@ -227,7 +228,7 @@ module.exports = class CocoView extends Backbone.View
$('#modal-wrapper .modal').modal(modalOptions).on 'hidden.bs.modal', @modalClosed $('#modal-wrapper .modal').modal(modalOptions).on 'hidden.bs.modal', @modalClosed
window.currentModal = modalView window.currentModal = modalView
@getRootView().stopListeningToShortcuts(true) @getRootView().stopListeningToShortcuts(true)
# setTimeout -> # setTimeout ->
# $('.modal').nanoScroller({contentClass:'modal-dialog'}) # $('.modal').nanoScroller({contentClass:'modal-dialog'})
# , 1000 # , 1000

View file

@ -0,0 +1,7 @@
View = require 'views/kinds/ModalView'
template = require 'templates/modal/employer_signup_modal'
module.exports = class EmployerSignupView extends View
id: "employer-signup"
template: template
closeButton: true

View file

@ -232,9 +232,9 @@ UserHandler = class UserHandler extends Handler
obj = _.pick document.toObject(), fields obj = _.pick document.toObject(), fields
obj.photoURL ||= obj.jobProfile.photoURL if authorized obj.photoURL ||= obj.jobProfile.photoURL if authorized
obj.photoURL ||= @buildGravatarURL document if authorized obj.photoURL ||= @buildGravatarURL document if authorized
subfields = ['country', 'city', 'lookingFor', 'skills', 'experience', 'updated'] subfields = ['country', 'city', 'lookingFor', 'jobTitle', 'skills', 'experience', 'updated']
if authorized if authorized
subfields = subfields.concat ['name', 'work'] subfields = subfields.concat ['name']
obj.jobProfile = _.pick obj.jobProfile, subfields obj.jobProfile = _.pick obj.jobProfile, subfields
obj obj