Commit 039891b2 by Van Hau Le

Merge branch 'feature/job_detail' into 'master'

Feature/job detail

See merge request !17
parents 23c11742 25a24032
......@@ -26,6 +26,7 @@ gem 'sunspot_solr'
gem 'devise'
gem 'activerecord-import'
gem 'config'
gem 'draper'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
......
......@@ -42,6 +42,10 @@ GEM
globalid (>= 0.3.6)
activemodel (6.0.1)
activesupport (= 6.0.1)
activemodel-serializers-xml (1.0.2)
activemodel (> 5.x)
activesupport (> 5.x)
builder (~> 3.1)
activerecord (6.0.1)
activemodel (= 6.0.1)
activesupport (= 6.0.1)
......@@ -99,6 +103,12 @@ GEM
railties (>= 4.1.0)
responders
warden (~> 1.2.3)
draper (3.1.0)
actionpack (>= 5.0)
activemodel (>= 5.0)
activemodel-serializers-xml (>= 1.0)
activesupport (>= 5.0)
request_store (>= 1.0)
dry-configurable (0.9.0)
concurrent-ruby (~> 1.0)
dry-core (~> 0.4, >= 0.4.7)
......@@ -224,6 +234,8 @@ GEM
rb-inotify (0.10.0)
ffi (~> 1.0)
regexp_parser (1.6.0)
request_store (1.4.1)
rack (>= 1.4)
responders (3.0.0)
actionpack (>= 5.0)
railties (>= 5.0)
......@@ -308,6 +320,7 @@ DEPENDENCIES
carrierwave
config
devise
draper
jbuilder
jquery-rails (= 4.3.1)
kaminari
......
......@@ -26,7 +26,6 @@ textarea {
}
.center {
text-align: center;
h1 {
margin-bottom: 10px;
}
......@@ -38,13 +37,6 @@ h1, h2, h3, h4, h5, h6 {
line-height: 1;
}
h1 {
font-size: 3em;
letter-spacing: -2px;
margin-bottom: 30px;
text-align: center;
}
h2 {
font-size: 1.2em;
letter-spacing: -1px;
......@@ -127,9 +119,10 @@ html {
/* job */
.box {
border: solid 1px black;
margin: 10px;
padding: 5px;
border-radius: .25rem;
background-color: rgba(226, 251, 253, 0.801);
margin-bottom: 15px;
padding: 10px;
.job_data {
width: 100%;
.job_data_row {
......@@ -157,3 +150,14 @@ dl, dt, dd {
list-style-type: none;
line-height: normal;
}
.breadcrumb {
font-weight: lighter;
font-size: 12px;
margin-bottom: 15px;
}
.job_detail_button {
margin: 10px;
padding: 5px;
}
class JobsController < ApplicationController
def index
@jobs = Job.page(params[:page]).per(Settings.job.per_page)
if params[:city_id]
@city = City.find(params[:city_id])
@jobs = @city.jobs
elsif params[:industry_id]
@industry = Industry.find(params[:industry_id])
@jobs = @industry.jobs
else
@jobs = Job.all
end
@jobs = @jobs.page(params[:page]).per(Settings.job.per_page).decorate
end
def show
@job = Job.find(params[:id]).decorate
end
end
class TopsController < ApplicationController
def index
@vn_cities = City.city_order.take(Settings.top.city.limit)
@industries = Industry.industry_order.take(Settings.top.city.limit)
@jobs = Job.latest_job
@vn_cities = City.city_order
@industries = Industry.industry_order
@latest_jobs = JobDecorator.decorate_collection(Job.latest_job)
end
end
class ApplicationDecorator < Draper::Decorator
def self.collection_decorator_class
PaginatingDecorator
end
end
class JobDecorator < ApplicationDecorator
include ActionView::Helpers::TextHelper
delegate_all
decorates_association :city
def city_name
object.cities&.first&.name
end
def company_name
object.company&.name
end
def display_short_des
simple_format object.short_des&.truncate(250)
end
def display_description
simple_format object.description
end
end
class PaginatingDecorator < Draper::CollectionDecorator
delegate :current_page, :total_pages, :limit_value, :entry_name, :total_count, :offset_value, :last_page?
end
......@@ -25,6 +25,6 @@ class City < ApplicationRecord
end
def self.city_order
@city_order ||= all.sort_by(&:job_count).reverse
@city_order ||= all.sort_by(&:job_count).reverse.take(Settings.top.city.limit)
end
end
......@@ -21,6 +21,6 @@ class Industry < ApplicationRecord
end
def self.industry_order
@industry_order ||= all.sort_by(&:job_count).reverse
@industry_order ||= all.sort_by(&:job_count).reverse.take(Settings.top.city.limit)
end
end
......@@ -38,6 +38,6 @@ class Job < ApplicationRecord
has_many :industries, through: :industry_jobs
def self.latest_job
@latest_job ||= Job.order(updated_at: :desc).take(Settings.top.job.limit)
@latest_job ||= order(updated_at: :desc).take(Settings.top.job.limit)
end
end
<div class="col-md-3">
<div class="col-show">
<%= link_to "#{city.name} (#{city.job_count})", jobs_path %>
<%= link_to "#{city.name} (#{city.job_count})", city_jobs_path(city.id) %>
</div>
</div>
<div class="container jumbotron text-center">
<div class="container text-center mb-4">
<h1>City List</h1>
<div class="row">
<div class="col-sm">
......
<div class="col-md-3">
<div class="col-show">
<%= link_to "#{industry.name} (#{industry.job_count})", jobs_path %>
<%= link_to "#{industry.name} (#{industry.job_count})", industry_jobs_path(industry.id) %>
</div>
</div>
<h1 class="text-center">Industry List</h1>
<div class="row row-cols-5">
<%= render partial: "industries/industry", collection: @industries %>
</div>
......@@ -2,11 +2,11 @@
<div class="job_data">
<dl class="job_data_row">
<dt>Title</dt>
<dd><%= job.title %></dd>
<dd><%= link_to job.title, job_path(job.id) %></dd>
</dl>
<dl class="job_data_row">
<dt>Short description</dt>
<dd><%= truncate(job.short_des, length: 250) %></dd>
<dd><%= job.display_short_des %></dd>
</dl>
<dl class="job_data_row">
<dt>Salary</dt>
......@@ -14,7 +14,7 @@
</dl>
<dl class="job_data_row">
<dt>Location</dt>
<dd><%= job&.cities&.first&.name %></dd>
<dd><%= job.city_name %></dd>
</dl>
</div>
<button type="button" class="btn btn-outline-secondary">Favorite</button>
......
<h3>Total: <%= Job.count %></h3>
<h3>Total: <%= params[:city_id] ? @city.job_count :
(params[:industry_id] ? @industry.job_count : Job.count) %></h3>
<h3>Result for: </h3>
<%= paginate @jobs %>
......
<div class="breadcrumb">
<%= link_to "Top", root_path %> >
<%= link_to "City", cities_path %> >
<%= link_to "Industry", industries_path %> >
<%= @job.title %>
</div>
<div class="box">
<h1>
<%= @job.title %>
</h1>
<div class="job_data">
<dl class="job_data_row">
<dt>Company</dt>
<dd><%= @job.company_name %></dd>
</dl>
<dl class="job_data_row">
<dt>Location</dt>
<dd><%= @job.city_name %></dd>
</dl>
<dl class="job_data_row">
<dt>Salary</dt>
<dd><%= @job.salary %></dd>
</dl>
<dl class="job_data_row">
<dt>Description</dt>
<dd><%= @job.display_description %></dd>
</dl>
</div>
</div>
<div class="job_detail_button">
<%= link_to "Favorite", "#", class: "btn btn-primary float-right" %>
<%= link_to "Apply", "#", class: "btn btn-primary float-right mx-3" %>
</div>
......@@ -2,11 +2,11 @@
<div class="job_data">
<dl class="job_data_row">
<dt>Title</dt>
<dd><%= latest_job.title %></dd>
<dd><%= link_to latest_job.title, job_path(latest_job.id) %></dd>
</dl>
<dl class="job_data_row">
<dt>Short description</dt>
<dd><%= truncate(latest_job.short_des, length: 250) %></dd>
<dd><%= latest_job.display_short_des %></dd>
</dl>
<dl class="job_data_row">
<dt>Salary</dt>
......@@ -14,7 +14,7 @@
</dl>
<dl class="job_data_row">
<dt>Location</dt>
<dd><%= latest_job&.cities&.first&.name %></dd>
<dd><%= latest_job.city_name %></dd>
</dl>
</div>
</div>
<% provide(:title, "Top Page") %>
<div class="center jumbotron">
<div class="banner">
<div class="jumbotron">
<div class="banner text-center">
<%= image_tag ("skyline_darker.jpg") %>
</div>
......@@ -9,19 +9,19 @@
<div class="search"></div>
<div class="lastest_jobs">
<h3>Latest jobs</h3>
<div class="latest_jobs">
<h3 class="text-center">Latest jobs</h3>
<div>
<%= render partial: "shared/latest_job", collection: @jobs %>
<%= render partial: "shared/latest_job", collection: @latest_jobs %>
</div>
</div>
<div class="top_cities">
<div class="top_cities text-center">
<%= render "shared/top_cities" %>
</div>
<div class="top_industries">
<div class="top_industries text-center">
<%= render "shared/top_industries"%>
</div>
</div>
......@@ -2,7 +2,9 @@ Rails.application.routes.draw do
resources :companies, only: :index
resources :industries, only: :index
resources :cities, only: :index
resources :jobs, only: :index
resources :jobs, only: [:index, :show]
get "jobs/city/:city_id", to: "jobs#index", as: :city_jobs
get "jobs/industry/:industry_id", to: "jobs#index", as: :industry_jobs
devise_for :users
root "tops#index"
namespace :users do
......
......@@ -4,6 +4,6 @@ namespace :task do
Import.new.import
import = ActiveSupport::Logger.new("log/import.log")
import.info "Cities, industries, companies, jobs imported succesful at #{Time.current}"
import.info "Cities, industries, companies, jobs imported succesfully at #{Time.current}"
end
end
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