Commit 4ba0a1de by Son Do Hong

Merge branch 'feature/Job_list' into 'master'

Feature/job list

See merge request !9
parents b5e8f81b e45719ec
......@@ -34,6 +34,7 @@ gem "rubysl-open-uri"
gem "whenever", require: false
gem "activerecord-import"
gem "config"
gem "kaminari"
group :development, :test do
# Call "byebug" anywhere in the code to stop execution and get a debugger console
......
......@@ -133,6 +133,18 @@ GEM
concurrent-ruby (~> 1.0)
jbuilder (2.9.1)
activesupport (>= 4.2.0)
kaminari (1.1.1)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.1.1)
kaminari-activerecord (= 1.1.1)
kaminari-core (= 1.1.1)
kaminari-actionview (1.1.1)
actionview
kaminari-core (= 1.1.1)
kaminari-activerecord (1.1.1)
activerecord
kaminari-core (= 1.1.1)
kaminari-core (1.1.1)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
......@@ -290,6 +302,7 @@ DEPENDENCIES
config
devise
jbuilder (~> 2.7)
kaminari
listen (>= 3.0.5, < 3.2)
mechanize
mysql2
......
class JobsController < ApplicationController
def index
if params[:city_id].present?
@jobs = City.find_by(id: params[:city_id]).jobs
elsif params[:industry_id].present?
@jobs = Industry.find_by(id: params[:industry_id]).jobs
else
@jobs = Job.all
end
@jobs = @jobs.page(params[:page]).per(Settings.all.job.limit)
end
end
......@@ -5,5 +5,4 @@ class Job < ApplicationRecord
def self.latest_jobs
@latest ||= order(created_at: :desc).take(Settings.top.job.limit)
end
end
<div class="container">
<div class="row justify-content-md-center">
<div class="col text-center">
<%= city.name %>
(<%= city.jobs_count %> jobs)
<%= link_to "#{city.name} (#{city.jobs_count})", city_jobs_path(city) %>
</div>
</div>
</div>
......@@ -2,7 +2,7 @@
<p>Someone has requested a link to change your password. You can do this through the link below.</p>
<p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p>
<p><%= link_to 'Change my password', forgot_password_url(@resource, reset_password_token: @token) %></p>
<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>
<h2>Change your password</h2>
<div class="container">
<div class="d-flex justify-content-center h-100">
<div class="card">
<div class="card-header text-center">
<h2>Change your password</h2>
</div>
<%= form_for(resource, as: resource_name, url: reset_password_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<%= f.hidden_field :reset_password_token %>
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<%= f.hidden_field :reset_password_token %>
<div class="field">
<%= f.label :password, "New password" %><br />
<% if @minimum_password_length %>
<div class="field">
<%= f.label :password, "New password" %><br />
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em><br />
<% end %>
<%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
</div>
<% end %>
<%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
</div>
<div class="field">
<%= f.label :password_confirmation, "Confirm new password" %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>
<div class="field">
<%= f.label :password_confirmation, "Confirm new password" %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>
</br>
<div class="actions text-center">
<%= f.submit "Change my password", class: "btn-primary" %>
</div>
<% end %>
<div class="actions">
<%= f.submit "Change my password" %>
</div>
<% end %>
</div>
</div>
<%= render "devise/shared/links" %>
</br>
......@@ -6,7 +6,7 @@
<div class="card-header text-center">
<h2>Forgot your password?</h2>
</div>
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
<%= form_for(resource, as: resource_name, url: forgot_password_path(resource_name), html: { method: :post }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<div class="field">
......@@ -14,8 +14,9 @@
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
</br>
<div class="actions text-center">
<%= f.submit "Confirm your email" %>
<%= f.submit "Confirm your email", class: "btn-primary" %>
</div>
<% end %>
</div>
......
<div class="container">
<div class="row justify-content-md-center">
<div class="col text-center">
<%= industry.name %>
(<%= industry.jobs_count %> jobs)
<%= link_to "#{industry.name} (#{industry.jobs_count})", industry_jobs_path(industry) %>
</div>
</div>
</div>
<div class="jobs-list">
<div class="row row-cols">
<div class="col">
<h4><b>Title:</b></h4> <%= simple_format jobs_list.title %>
</div>
<div class="col">
<h4><b>Salary:</b></h4> <%= jobs_list.salary%>
</div>
<div class="col">
<h4><b>Level:</b></h4> <%= simple_format jobs_list.position %>
</div>
</div>
<div class="row row-cols">
<div class="col">
<h4><b>Description:</b></h4>
<%= truncate(simple_format(jobs_list.description), escape: false, length: 250) %>
</div>
</div>
<div class="row row-cols">
<div class="col">
<h4> <b>Requirement:</b></h4>
<%= ( simple_format jobs_list.requirement) %>
</div>
</div>
</br>
</div>
<div class="center jumbotron">
<head>
<title><%= yield(:title) %> Venjob</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
</div>
<!--Display all jobs -->
<div class="all jobs">
<div class="job-title-wrapper">
<h3>All Jobs</h3>
</div>
<%= paginate @jobs %>
<div class="row row-cols-1">
<div class="job-content-wrapper">
<%= render partial: "jobs/jobs_list", collection: @jobs %>
</div>
</div>
<%= paginate @jobs %>
<li class="page-item">
<%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, remote: remote, class: 'page-link' %>
</li>
<li class='page-item disabled'>
<%= link_to raw(t 'views.pagination.truncate'), '#', class: 'page-link' %>
</li>
<li class="page-item">
<%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, remote: remote, class: 'page-link' %>
</li>
<li class="page-item">
<%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, rel: 'next', remote: remote, class: 'page-link' %>
</li>
<% if page.current? %>
<li class="page-item active">
<%= content_tag :a, page, data: { remote: remote }, rel: page.rel, class: 'page-link' %>
</li>
<% else %>
<li class="page-item">
<%= link_to page, url, remote: remote, rel: page.rel, class: 'page-link' %>
</li>
<% end %>
<%= paginator.render do %>
<nav>
<ul class="pagination">
<%= first_page_tag unless current_page.first? %>
<%= prev_page_tag unless current_page.first? %>
<% each_page do |page| %>
<% if page.left_outer? || page.right_outer? || page.inside_window? %>
<%= page_tag page %>
<% elsif !page.was_truncated? -%>
<%= gap_tag %>
<% end %>
<% end %>
<%= next_page_tag unless current_page.last? %>
<%= last_page_tag unless current_page.last? %>
</ul>
</nav>
<% end %>
<li class="page-item">
<%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, rel: 'prev', remote: remote, class: 'page-link' %>
</li>
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="container">
<%= link_to image_tag("zigexn_logo.png", id: "logo", alt: "Venjob logo") %>
<%= link_to root_path do %>
<%= image_tag("zigexn_logo.png", id:"logo", alt: "Venjob logo") %>
<% end %>
<nav class="navbar navbar-light bg-light">
<% if user_signed_in? %>
<%= link_to "Log out", destroy_user_session_path, method: :delete, class: "btn btn-outline-success" %>
......
......@@ -56,14 +56,11 @@ Rails.application.configure do
# Raises error for missing translations.
# config.action_view.raise_on_missing_translations = true
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
# Use this on the cloud IDE.
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config.action_mailer.smtp_settings = { address: '127.0.0.1', port: 1025 }
config.action_mailer.smtp_settings = { address: 'localhost', port: 1025 }
# Use this if developing on localhost.
# config.action_mailer.default_url_options = { host: host, protocol: 'http' }
end
......@@ -31,3 +31,12 @@
en:
hello: "Hello world"
views:
pagination:
first: "« FIRST"
last: "LAST »"
previous: " PREV"
next: "NEXT ›"
truncate: "…"
more_pages:
display_entries: "Displaying %{entry_name} <b>%{first} - %{last}</b> of <b>%{total}</b> in total"
......@@ -2,8 +2,8 @@ Rails.application.routes.draw do
root "top#index"
resources :cities, only: :index
resources :industries, only: :index
resource :top, only: :index
resource :users, only: :show
resources :top, only: :index
resources :users, only: :show
devise_for :users
as :user do
get "login" , to: "devise/sessions#new"
......@@ -12,5 +12,18 @@ Rails.application.routes.draw do
put "registration.user/", to: "devise/registrations#update"
get "my/info", to: "devise/registrations#edit"
get "my/", to: "users#show"
get "forgot_password", to: "devise/passwords#edit"
get "reset_password", to: "devise/passwords#new"
post "forgot_password.user/", to: "devise/passwords#create"
put "reset_password.user", to: "devise/passwords#update"
end
get "jobs/city/:city_id", to: "jobs#index", as: "city_jobs"
get "jobs/industry/:industry_id", to: "jobs#index", as: "industry_jobs"
concern :paginatable do
get "(page/:page)", action: :index, on: :collection, as: ""
end
resources :jobs, only: :index, concerns: :paginatable
end
......@@ -8,3 +8,7 @@ top:
limit: 9
industry:
limit: 9
all:
job:
limit: 20
......@@ -7,6 +7,6 @@
set :environment, "development"
set :output, "/crawler/config/import_log.log"
every 1.day at: '5:00 pm' do
every 1.day at: '4:00 pm' do
rake "job:create"
end
......@@ -42,7 +42,7 @@ class DeviseCreateUsers < ActiveRecord::Migration[6.0]
add_index :users, :email, unique: true
add_index :users, :username, unique: true
add_index :users, :reset_digest, unique: true
add_index :users, :confirmation_token, unique: true
#add_index :users, :confirmation_token, unique: true
# add_index :users, :unlock_token, unique: true
end
end
class AddResetPasswordTouser < ActiveRecord::Migration[6.0]
class AddResetPasswordToUser < ActiveRecord::Migration[6.0]
def change
add_column :users, :reset_password_token, :string
add_column :users, :reset_password_sent_at, :datetime
......
class ChangeSalaryInJobs < ActiveRecord::Migration[6.0]
def change
change_column :jobs, :salary, :string
end
end
......@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2020_01_02_012922) do
ActiveRecord::Schema.define(version: 2020_01_06_041448) do
create_table "cities", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "name"
......@@ -57,7 +57,7 @@ ActiveRecord::Schema.define(version: 2020_01_02_012922) do
t.text "description"
t.text "short_description"
t.integer "company_id"
t.decimal "salary", precision: 10
t.string "salary"
t.integer "currency"
t.text "requirement"
t.string "position"
......@@ -96,6 +96,7 @@ ActiveRecord::Schema.define(version: 2020_01_02_012922) do
t.string "remember_digest"
t.datetime "activated_at"
t.string "activation_digest"
t.datetime "confirmation_sent_at"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "encrypted_password"
......
......@@ -34,7 +34,7 @@ namespace :job do
requirement = job_page.css("div.content_fck")[1].css("p").text
end
salary = job_page.css("div#showScroll.box2Detail").css("ul.DetailJobNew").css("li.bgLine2").css("p.fl_right").text
salary = job_page.css("div#showScroll.box2Detail").css("ul.DetailJobNew").css("li.bgLine2").css("p.fl_right")[1].text
position = job_page.css("div#showScroll.box2Detail").css("ul.DetailJobNew").css("li.bgLine1").css("p.fl_left").text
rescue
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment