recruiter 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +2 -0
- data/app/assets/images/ruby.png +0 -0
- data/app/assets/images/ruby_72x72.png +0 -0
- data/app/assets/images/ruby_rotated.png +0 -0
- data/app/assets/images/ruby_worker.png +0 -0
- data/app/assets/javascripts/recruiter/application.js +3 -0
- data/app/assets/javascripts/recruiter/filters.js +35 -0
- data/app/assets/javascripts/recruiter/site.js +3 -0
- data/app/assets/stylesheets/recruiter/application.css.scss +7 -0
- data/app/assets/stylesheets/recruiter/foundation_and_overrides.scss +1251 -0
- data/app/assets/stylesheets/recruiter/gh-fork-ribbon.css +140 -0
- data/app/assets/stylesheets/recruiter/site.css.sass +116 -0
- data/app/assets/stylesheets/recruiter/variables.css.sass +6 -0
- data/app/controllers/recruiter/filters_controller.rb +14 -0
- data/app/controllers/recruiter/jobs_controller.rb +18 -0
- data/app/controllers/recruiter/omniauth_callbacks_controller.rb +45 -0
- data/app/controllers/recruiter/users/jobs_controller.rb +59 -0
- data/app/controllers/recruiter/users/user_controller.rb +8 -0
- data/app/controllers/recruiter_controller.rb +13 -0
- data/app/decorators/recruiter/job_decorator.rb +49 -0
- data/app/decorators/recruiter/user_decorator.rb +22 -0
- data/app/helpers/recruiter/crud_flash_messager_helper.rb +21 -0
- data/app/helpers/recruiter/form_helper.rb +29 -0
- data/app/helpers/recruiter/header_helper.rb +13 -0
- data/app/helpers/recruiter/icons_helper.rb +29 -0
- data/app/helpers/recruiter/links_helper.rb +59 -0
- data/app/helpers/recruiter/markdown_helper.rb +12 -0
- data/app/helpers/recruiter/oauth_providers_helper.rb +23 -0
- data/app/helpers/recruiter/show_helper.rb +29 -0
- data/app/models/recruiter/city.rb +9 -0
- data/app/models/recruiter/custom_devise_failure.rb +7 -0
- data/app/models/recruiter/filters.rb +44 -0
- data/app/models/recruiter/filters/city_filter.rb +21 -0
- data/app/models/recruiter/filters/job_filter.rb +21 -0
- data/app/models/recruiter/filters/state_filter.rb +17 -0
- data/app/models/recruiter/job.rb +34 -0
- data/app/{helpers/recruiter/application_helper.rb → models/recruiter/oauth.rb} +1 -1
- data/app/models/recruiter/oauth/base.rb +24 -0
- data/app/models/recruiter/oauth/facebook.rb +6 -0
- data/app/models/recruiter/oauth/github.rb +6 -0
- data/app/models/recruiter/oauth/google.rb +9 -0
- data/app/models/recruiter/state.rb +9 -0
- data/app/models/recruiter/tag.rb +6 -0
- data/app/models/recruiter/user.rb +11 -0
- data/app/views/devise/sessions/new.html.erb +8 -0
- data/app/views/kaminari/_first_page.html.erb +11 -0
- data/app/views/kaminari/_gap.html.erb +8 -0
- data/app/views/kaminari/_last_page.html.erb +11 -0
- data/app/views/kaminari/_next_page.html.erb +11 -0
- data/app/views/kaminari/_page.html.erb +12 -0
- data/app/views/kaminari/_paginator.html.erb +23 -0
- data/app/views/kaminari/_prev_page.html.erb +11 -0
- data/app/views/layouts/recruiter/application.html.erb +28 -10
- data/app/views/recruiter/_analytics.html.erb +10 -0
- data/app/views/recruiter/_filters.html.erb +17 -0
- data/app/views/recruiter/_flashes.html.erb +14 -0
- data/app/views/recruiter/_footer.html.erb +7 -0
- data/app/views/recruiter/_form_actions.html.erb +4 -0
- data/app/views/recruiter/_javascript.html.erb +10 -0
- data/app/views/recruiter/_login_button.html.erb +15 -0
- data/app/views/recruiter/_login_links.html.erb +7 -0
- data/app/views/recruiter/_login_status.html.erb +8 -0
- data/app/views/recruiter/_show_actions.html.erb +6 -0
- data/app/views/recruiter/_show_item.html.erb +8 -0
- data/app/views/recruiter/_tags.html.erb +6 -0
- data/app/views/recruiter/_top_menu.html.erb +28 -0
- data/app/views/recruiter/jobs/_job.html.erb +14 -0
- data/app/views/recruiter/jobs/index.html.erb +14 -0
- data/app/views/recruiter/jobs/show.html.erb +1 -0
- data/app/views/recruiter/users/jobs/_form.html.erb +30 -0
- data/app/views/recruiter/users/jobs/_job.html.erb +35 -0
- data/app/views/recruiter/users/jobs/edit.html.erb +3 -0
- data/app/views/recruiter/users/jobs/index.html.erb +24 -0
- data/app/views/recruiter/users/jobs/new.html.erb +3 -0
- data/app/views/recruiter/users/jobs/show.html.erb +4 -0
- data/config/initializers/devise.rb +272 -0
- data/config/initializers/simple_form.rb +145 -0
- data/config/routes.rb +19 -0
- data/config/spring.rb +1 -0
- data/db/migrate/20140617180316_create_recruiter_states.rb +12 -0
- data/db/migrate/20140617180934_create_recruiter_cities.rb +14 -0
- data/db/migrate/20140618164609_create_recruiter_users.rb +51 -0
- data/db/migrate/20140618165301_add_name_to_users.rb +5 -0
- data/db/migrate/20140618165802_create_recruiter_jobs.rb +14 -0
- data/db/migrate/20140618170815_create_recruiter_tags.rb +13 -0
- data/db/migrate/20140618170904_create_recruiter_jobs_tags.rb +10 -0
- data/lib/generators/templates/locales/devise.en.yml +59 -0
- data/lib/generators/templates/locales/devise.pt-BR.yml +60 -0
- data/lib/generators/templates/locales/en.yml +11 -0
- data/lib/generators/templates/locales/pt-BR.yml +237 -0
- data/lib/generators/templates/locales/recruiter.pt-BR.yml +78 -0
- data/lib/generators/templates/locales/simple_form.en.yml +26 -0
- data/lib/recruiter.rb +12 -0
- data/lib/recruiter/engine.rb +31 -0
- data/lib/recruiter/version.rb +1 -1
- metadata +362 -11
- data/app/assets/stylesheets/recruiter/application.css +0 -15
- data/app/controllers/recruiter/application_controller.rb +0 -4
@@ -0,0 +1,140 @@
|
|
1
|
+
/*!
|
2
|
+
* "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License
|
3
|
+
* https://github.com/simonwhitaker/github-fork-ribbon-css
|
4
|
+
*/
|
5
|
+
|
6
|
+
/* Left will inherit from right (so we don't need to duplicate code) */
|
7
|
+
.github-fork-ribbon {
|
8
|
+
/* The right and left classes determine the side we attach our banner to */
|
9
|
+
position: absolute;
|
10
|
+
|
11
|
+
/* Add a bit of padding to give some substance outside the "stitching" */
|
12
|
+
padding: 2px 0;
|
13
|
+
|
14
|
+
/* Set the base colour */
|
15
|
+
background-color: #a00;
|
16
|
+
|
17
|
+
/* Set a gradient: transparent black at the top to almost-transparent black at the bottom */
|
18
|
+
background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15)));
|
19
|
+
background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
|
20
|
+
background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
|
21
|
+
background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
|
22
|
+
background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
|
23
|
+
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
|
24
|
+
|
25
|
+
/* Add a drop shadow */
|
26
|
+
-webkit-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
|
27
|
+
-moz-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
|
28
|
+
box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5);
|
29
|
+
|
30
|
+
/* Set the font */
|
31
|
+
font: 700 13px "Helvetica Neue", Helvetica, Arial, sans-serif;
|
32
|
+
|
33
|
+
z-index: 9999;
|
34
|
+
pointer-events: auto;
|
35
|
+
}
|
36
|
+
|
37
|
+
.github-fork-ribbon a,
|
38
|
+
.github-fork-ribbon a:hover {
|
39
|
+
/* Set the text properties */
|
40
|
+
color: #fff;
|
41
|
+
text-decoration: none;
|
42
|
+
text-shadow: 0 -1px rgba(0, 0, 0, 0.5);
|
43
|
+
text-align: center;
|
44
|
+
|
45
|
+
/* Set the geometry. If you fiddle with these you'll also need
|
46
|
+
to tweak the top and right values in .github-fork-ribbon. */
|
47
|
+
width: 200px;
|
48
|
+
line-height: 20px;
|
49
|
+
|
50
|
+
/* Set the layout properties */
|
51
|
+
display: inline-block;
|
52
|
+
padding: 2px 0;
|
53
|
+
|
54
|
+
/* Add "stitching" effect */
|
55
|
+
border-width: 1px 0;
|
56
|
+
border-style: dotted;
|
57
|
+
border-color: #fff;
|
58
|
+
border-color: rgba(255, 255, 255, 0.7);
|
59
|
+
}
|
60
|
+
|
61
|
+
.github-fork-ribbon-wrapper {
|
62
|
+
width: 150px;
|
63
|
+
height: 150px;
|
64
|
+
position: absolute;
|
65
|
+
overflow: hidden;
|
66
|
+
top: 0;
|
67
|
+
z-index: 9999;
|
68
|
+
pointer-events: none;
|
69
|
+
}
|
70
|
+
|
71
|
+
.github-fork-ribbon-wrapper.fixed {
|
72
|
+
position: fixed;
|
73
|
+
}
|
74
|
+
|
75
|
+
.github-fork-ribbon-wrapper.left {
|
76
|
+
left: 0;
|
77
|
+
}
|
78
|
+
|
79
|
+
.github-fork-ribbon-wrapper.right {
|
80
|
+
right: 0;
|
81
|
+
}
|
82
|
+
|
83
|
+
.github-fork-ribbon-wrapper.left-bottom {
|
84
|
+
position: fixed;
|
85
|
+
top: inherit;
|
86
|
+
bottom: 0;
|
87
|
+
left: 0;
|
88
|
+
}
|
89
|
+
|
90
|
+
.github-fork-ribbon-wrapper.right-bottom {
|
91
|
+
position: fixed;
|
92
|
+
top: inherit;
|
93
|
+
bottom: 0;
|
94
|
+
right: 0;
|
95
|
+
}
|
96
|
+
|
97
|
+
.github-fork-ribbon-wrapper.right .github-fork-ribbon {
|
98
|
+
top: 42px;
|
99
|
+
right: -43px;
|
100
|
+
|
101
|
+
-webkit-transform: rotate(45deg);
|
102
|
+
-moz-transform: rotate(45deg);
|
103
|
+
-ms-transform: rotate(45deg);
|
104
|
+
-o-transform: rotate(45deg);
|
105
|
+
transform: rotate(45deg);
|
106
|
+
}
|
107
|
+
|
108
|
+
.github-fork-ribbon-wrapper.left .github-fork-ribbon {
|
109
|
+
top: 42px;
|
110
|
+
left: -43px;
|
111
|
+
|
112
|
+
-webkit-transform: rotate(-45deg);
|
113
|
+
-moz-transform: rotate(-45deg);
|
114
|
+
-ms-transform: rotate(-45deg);
|
115
|
+
-o-transform: rotate(-45deg);
|
116
|
+
transform: rotate(-45deg);
|
117
|
+
}
|
118
|
+
|
119
|
+
|
120
|
+
.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon {
|
121
|
+
top: 80px;
|
122
|
+
left: -43px;
|
123
|
+
|
124
|
+
-webkit-transform: rotate(45deg);
|
125
|
+
-moz-transform: rotate(45deg);
|
126
|
+
-ms-transform: rotate(45deg);
|
127
|
+
-o-transform: rotate(45deg);
|
128
|
+
transform: rotate(45deg);
|
129
|
+
}
|
130
|
+
|
131
|
+
.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon {
|
132
|
+
top: 80px;
|
133
|
+
right: -43px;
|
134
|
+
|
135
|
+
-webkit-transform: rotate(-45deg);
|
136
|
+
-moz-transform: rotate(-45deg);
|
137
|
+
-ms-transform: rotate(-45deg);
|
138
|
+
-o-transform: rotate(-45deg);
|
139
|
+
transform: rotate(-45deg);
|
140
|
+
}
|
@@ -0,0 +1,116 @@
|
|
1
|
+
// @import 'variables'
|
2
|
+
$soft-gray: #eeeeee
|
3
|
+
$dark-gray: #333333
|
4
|
+
$dark-red: #980905
|
5
|
+
$red: #C52F24
|
6
|
+
$soft-blue: #D5E9F6
|
7
|
+
$soft-yellow: #FFF9D8
|
8
|
+
@import 'foundation_and_overrides'
|
9
|
+
body
|
10
|
+
// background: $soft-gray
|
11
|
+
|
12
|
+
.list.no-buttons
|
13
|
+
list-style: none
|
14
|
+
|
15
|
+
table.wide
|
16
|
+
width: 100%
|
17
|
+
|
18
|
+
button, .button
|
19
|
+
margin: 0
|
20
|
+
.actions
|
21
|
+
max-width: 80px
|
22
|
+
|
23
|
+
.wrapper
|
24
|
+
margin: 10px 0
|
25
|
+
|
26
|
+
#middle
|
27
|
+
padding: 20px 0
|
28
|
+
background: white
|
29
|
+
|
30
|
+
#main_content
|
31
|
+
#after_menu
|
32
|
+
background: $red
|
33
|
+
h1
|
34
|
+
color: white
|
35
|
+
img
|
36
|
+
width: 10%
|
37
|
+
|
38
|
+
#job
|
39
|
+
.how-to-apply
|
40
|
+
background: $soft-yellow
|
41
|
+
margin: 20px 0
|
42
|
+
padding: 20px
|
43
|
+
.main, footer
|
44
|
+
background: $soft-blue
|
45
|
+
margin: 20px 0
|
46
|
+
padding: 20px
|
47
|
+
|
48
|
+
footer
|
49
|
+
background: $soft-gray
|
50
|
+
#jobs
|
51
|
+
article
|
52
|
+
background: $soft-blue
|
53
|
+
.job
|
54
|
+
margin: 5px
|
55
|
+
// border-bottom: 1px solid #ccc
|
56
|
+
.wrapper
|
57
|
+
margin: 10px 0 15px 0
|
58
|
+
.published_date
|
59
|
+
font-size: 0.75em
|
60
|
+
h2
|
61
|
+
color: $dark-gray
|
62
|
+
|
63
|
+
.black
|
64
|
+
color: black
|
65
|
+
|
66
|
+
.fi-social-github
|
67
|
+
&.medium
|
68
|
+
font-size: 30px
|
69
|
+
&.large
|
70
|
+
font-size: 50px
|
71
|
+
|
72
|
+
body > footer
|
73
|
+
background: white
|
74
|
+
padding-top: 20px
|
75
|
+
position: relative
|
76
|
+
min-height: 70px
|
77
|
+
|
78
|
+
.line
|
79
|
+
padding: 5px 0
|
80
|
+
font-size: 0.8em
|
81
|
+
|
82
|
+
@media #{$medium-up}
|
83
|
+
font-size: 1em
|
84
|
+
|
85
|
+
.tags
|
86
|
+
margin-bottom: 5px
|
87
|
+
|
88
|
+
i
|
89
|
+
margin-right: 5px
|
90
|
+
|
91
|
+
.tag
|
92
|
+
background: $red
|
93
|
+
width: none
|
94
|
+
padding: 5px
|
95
|
+
color: white
|
96
|
+
font-size: 0.75em
|
97
|
+
|
98
|
+
@media #{$medium-up}
|
99
|
+
font-size: 0.8em
|
100
|
+
|
101
|
+
.github-fork-ribbon-wrapper.right-bottom
|
102
|
+
position: absolute
|
103
|
+
.github-fork-ribbon
|
104
|
+
background: $dark-gray
|
105
|
+
|
106
|
+
form
|
107
|
+
.hint
|
108
|
+
margin: -10px 0 10px 0
|
109
|
+
font-size: 0.7em
|
110
|
+
display: block
|
111
|
+
color: $red
|
112
|
+
|
113
|
+
@media #{$medium-up}
|
114
|
+
font-size: 0.8em
|
115
|
+
a
|
116
|
+
text-decoration: underline
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Recruiter
|
2
|
+
class FiltersController < ::RecruiterController
|
3
|
+
def index
|
4
|
+
@records = ::Recruiter::Filters.filter(type, params).map do |record|
|
5
|
+
{ id: record.id, name: record.name }
|
6
|
+
end
|
7
|
+
render json: @records
|
8
|
+
end
|
9
|
+
|
10
|
+
def type
|
11
|
+
params.require(:filter)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Recruiter
|
2
|
+
class JobsController < ::RecruiterController
|
3
|
+
def index
|
4
|
+
@jobs = ::Recruiter::Filters::JobFilter.filter(filter_params).
|
5
|
+
open.page(page).per(per_page)
|
6
|
+
end
|
7
|
+
|
8
|
+
def show
|
9
|
+
@job = Job.find(params[:id])
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def filter_params
|
15
|
+
params.select { |k, v| v.present? }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Recruiter
|
2
|
+
class OmniauthCallbacksController < ::Devise::OmniauthCallbacksController
|
3
|
+
# For handling errors
|
4
|
+
def new_session_path(scope)
|
5
|
+
new_user_session_path
|
6
|
+
end
|
7
|
+
|
8
|
+
def facebook
|
9
|
+
login_with(Oauth::Facebook)
|
10
|
+
end
|
11
|
+
|
12
|
+
def google_oauth2
|
13
|
+
login_with(Oauth::Google)
|
14
|
+
end
|
15
|
+
|
16
|
+
def github
|
17
|
+
login_with(Oauth::Github)
|
18
|
+
end
|
19
|
+
|
20
|
+
def login_with(klass)
|
21
|
+
env = request.env["omniauth.auth"]
|
22
|
+
origin = request.env["omniauth.origin"]
|
23
|
+
user = klass.find_or_build_user(env)
|
24
|
+
redirect_url = redirect_url_for(user, origin)
|
25
|
+
message = login_message(user)
|
26
|
+
user.save!(validate: false)
|
27
|
+
sign_in(user, event: :authentication)
|
28
|
+
redirect_to redirect_url, notice: message, only_path: true
|
29
|
+
end
|
30
|
+
|
31
|
+
def login_message(user)
|
32
|
+
key = user.new_record? ? 'account_created' : 'login_succeed'
|
33
|
+
I18n.t("recruiter.messages.#{key}")
|
34
|
+
end
|
35
|
+
|
36
|
+
def redirect_url_for(user, origin = nil)
|
37
|
+
origin || root_url
|
38
|
+
end
|
39
|
+
|
40
|
+
def relative_path(url)
|
41
|
+
matches = url.match(/^http(s)?:\/\/[^\/]+(.*)/)
|
42
|
+
matches ? matches[2] : url
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Recruiter
|
2
|
+
module Users
|
3
|
+
class JobsController < UserController
|
4
|
+
before_action :set_job, only: [:show, :edit, :update, :destroy]
|
5
|
+
|
6
|
+
def index
|
7
|
+
@jobs = scope.page(page).per(per_page)
|
8
|
+
respond_with(@jobs)
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
respond_with(@job)
|
13
|
+
end
|
14
|
+
|
15
|
+
def edit
|
16
|
+
respond_with(@job)
|
17
|
+
end
|
18
|
+
|
19
|
+
def new
|
20
|
+
# TODO: This fixes issue #10. Not a beautiful think to do here
|
21
|
+
flash.delete(:alert)
|
22
|
+
@job = scope.new
|
23
|
+
respond_with(@job)
|
24
|
+
end
|
25
|
+
|
26
|
+
def create
|
27
|
+
@job = scope.build(job_params)
|
28
|
+
crud_flash @job.save
|
29
|
+
respond_with(@job)
|
30
|
+
end
|
31
|
+
|
32
|
+
def update
|
33
|
+
crud_flash @job.update(job_params)
|
34
|
+
respond_with(@job)
|
35
|
+
end
|
36
|
+
|
37
|
+
def destroy
|
38
|
+
crud_flash @job.destroy
|
39
|
+
respond_with(@job)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def scope
|
45
|
+
current_user.jobs
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_job
|
49
|
+
@job = scope.find(params[:id])
|
50
|
+
end
|
51
|
+
|
52
|
+
def job_params
|
53
|
+
params.require(:job).permit(
|
54
|
+
:title, :description, :how_to_apply, :city_id, :state_id, tag_ids: []
|
55
|
+
).to_hash.reverse_merge(tag_ids: [])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Recruiter
|
2
|
+
class JobDecorator < Draper::Decorator
|
3
|
+
delegate_all
|
4
|
+
|
5
|
+
def created_at_ago
|
6
|
+
h.time_ago_in_words(object.created_at)
|
7
|
+
end
|
8
|
+
|
9
|
+
def title
|
10
|
+
object.title.titleize
|
11
|
+
end
|
12
|
+
|
13
|
+
def updated_at_ago
|
14
|
+
h.time_ago_in_words(object.created_at)
|
15
|
+
end
|
16
|
+
|
17
|
+
def updated?
|
18
|
+
object.created_at < object.updated_at
|
19
|
+
end
|
20
|
+
|
21
|
+
def published_at
|
22
|
+
h.t('recruiter.messages.posts.published_at', time: created_at_ago)
|
23
|
+
end
|
24
|
+
|
25
|
+
def updated_at
|
26
|
+
h.t('recruiter.messages.posts.updated_at', time: updated_at_ago)
|
27
|
+
end
|
28
|
+
|
29
|
+
def city
|
30
|
+
object.city.name
|
31
|
+
end
|
32
|
+
|
33
|
+
def state
|
34
|
+
object.city.state.name
|
35
|
+
end
|
36
|
+
|
37
|
+
def location
|
38
|
+
"#{city}/#{short_state}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def short_state
|
42
|
+
object.city.state.short
|
43
|
+
end
|
44
|
+
|
45
|
+
def tag_names
|
46
|
+
tags.map(&:name)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|