Commit 4130be81 by Huỳnh Thiên Phước

merge admin_page to master

parents 3885ed4c 5cfe23ce
Pipeline #1105 failed with stages
in 0 seconds
......@@ -24,4 +24,9 @@
font-style: italic;
font-size: 16px;
}
.tilde {
color: black;
}
.city-options, .industry-options, .datetime{
margin: 20px 0 20px 0;
}
class AdminsController < ApplicationController
before_action :sign_out_current_user
before_action :remove_session, only:[:index]
before_action :sign_in_validation_admin, only: [:index, :destroy, :search]
def index
@cities = City.all
@industries = Industry.all
@apply_job = JobApplied.includes(job: :cities).includes(job: :industries)
@user_apply_job = @apply_job.order(updated_at: :desc).page(params[:page]).per(Job::LIMIT_PAGE)
@days = []
(Admin::FIRST_DAY..Admin::LAST_DAY).each {|d| @days << d}
@months = []
(Admin::FIRST_MONTH..Admin::LAST_MONTH).each {|m| @months << m}
@years = []
(Admin::FIRST_YEAR..Admin::LAST_YEAR).each {|y| @years << y}
end
def search
@cities = City.all
@industries = Industry.all
if params[:commit] == 'Search'
session[:input_email] = params[:admin][:email]
session[:input_city] = params[:admin][:city_opt]
session[:input_industry] = params[:admin][:industry_opt]
from_day = params[:admin][:from_day]
from_month = params[:admin][:from_month]
from_year = params[:admin][:from_year]
session[:from_datetime] = "#{from_year}/#{from_month}/#{from_day}"
params[:admin][:to_day].blank? ? to_day = Admin::LAST_DAY : to_day = params[:admin][:to_day]
params[:admin][:to_month].blank? ? to_month = Admin::LAST_MONTH : to_month = params[:admin][:to_month]
params[:admin][:to_year].blank? ? to_year = Admin::LAST_YEAR : to_year = params[:admin][:to_year]
session[:to_datetime] = "#{to_year}/#{to_month}/#{to_day}"
end
@apply_job = JobApplied.includes(job: :cities).includes(job: :industries).email(session[:input_email]).city(session[:input_city]).industry(session[:input_industry]).datetime(session[:from_datetime], session[:to_datetime])
@user_apply_job = @apply_job.order(updated_at: :desc).page(params[:page]).per(Job::LIMIT_PAGE)
@days = []
(Admin::FIRST_DAY..Admin::LAST_DAY).each {|d| @days << d}
@months = []
(Admin::FIRST_MONTH..Admin::LAST_MONTH).each {|m| @months << m}
@years = []
(Admin::FIRST_YEAR..Admin::LAST_YEAR).each {|y| @years << y}
end
def download_csv
input_email = session[:input_email]
input_city = session[:input_city]
input_industry = session[:input_industry]
from_datetime = session[:from_datetime]
to_datetime = session[:to_datetime]
@apply_job = JobApplied.includes(job: :cities).includes(job: :industries).email(input_email).city(input_city).industry(input_industry).datetime(from_datetime, to_datetime)
@apply_job = JobApplied.includes(job: :cities).includes(job: :industries) if @apply_job.blank?
@user_apply_job = @apply_job.order(updated_at: :desc)
csv = ExportCsvService.new(@user_apply_job, JobApplied::CSV_ATTRIBUTES)
respond_to do |format|
format.csv { send_data csv.perform,
filename: "applied-jobs-#{Date.today}.csv"}
end
end
def new
redirect_to admin_page_path if signed_in? && current_user.admin?
end
def create
user = User.find_by(email: params[:admin][:email].downcase, admin: true)
if user && user.authenticate(params[:admin][:password])
sign_in user
redirect_to admin_page_path
else
flash.now[:danger] = Settings.user.sign_in.failed
render :new
end
end
def destroy
sign_out
redirect_to root_path
end
private
def remove_session
reset_session
end
def sign_out_current_user
sign_out if signed_in? && current_user.admin.nil?
end
def sign_in_validation_admin
return if signed_in? && current_user.admin?
store_location
flash[:warning] = Settings.user.warning_signin
redirect_to admin_login_path
end
end
class SessionsController < ApplicationController
def new
redirect_to my_page_path if signed_in?
return redirect_to admin_page_path if signed_in? && current_user.admin?
redirect_to my_page_path if signed_in? && current_user.admin.nil?
end
def create
user = User.find_by(email: params[:session][:email].downcase)
user = User.find_by(email: params[:session][:email].downcase, admin: nil)
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_back_or my_page_path
......
class UsersController < ApplicationController
before_action :sign_out_admin
before_action :sign_in_validation, only: [:update, :my_page, :my_info]
def my_page
......@@ -38,6 +39,17 @@ class UsersController < ApplicationController
private
def sign_out_admin
sign_out if signed_in? && current_user.admin?
end
def sign_in_validation
return if signed_in?
store_location
flash[:warning] = Settings.user.warning_signin
redirect_to login_path
end
def user_params
params[:user][:password] = change_pass_param[:new_password] if change_pass_param[:new_password].present?
params.require(:user).permit(:name, :email, :cv_user, :password)
......
class Admin < ApplicationRecord
FIRST_DAY = 1
LAST_DAY = 31
FIRST_MONTH = 1
LAST_MONTH = 12
FIRST_YEAR = 2015
LAST_YEAR = Time.current.year
end
......@@ -5,9 +5,19 @@ class JobApplied < ApplicationRecord
belongs_to :user
belongs_to :job
scope :email, ->(email) { where(email: email) if email.present? }
scope :city, ->(city_id) { where(cities: {id: city_id}) if city_id.present? }
scope :industry, ->(industry_id) { where(industries: {id: industry_id}) if industry_id.present?}
scope :datetime, ->(from_datetime, to_datetime) {
where("job_applieds.updated_at BETWEEN ? AND ?", from_datetime, to_datetime)
}
LIMIT_PAGE = 20
CSV_ATTRIBUTES = %w(title name cv_user email updated_at).freeze
validates :name, presence: true, length: { maximum: 200 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 200 }, format: { with: VALID_EMAIL_REGEX }
validates :cv_user, presence: true
end
require 'csv'
class ExportCsvService
def initialize(objects, attributes)
@attributes = attributes
@objects = objects
end
def perform
CSV.generate do |csv|
csv << attributes
objects.each do |object|
info_applied = object.attributes.values_at(*attributes)
info_applied[0] = object.job.title
csv << info_applied
end
end
end
private
attr_reader :objects, :attributes
end
<div class="row">
<div class="text col-3">Date:</div>
<div class="form-group mb-2"><%= f.select :from_year, options_for_select(@years.collect{ |year| year }), {}, {class: 'form-control'} %></div>
<div class="form-group mb-2"><%= f.select :from_month, options_for_select(@months.collect{ |month| month }), {}, {class: 'form-control'}%></div>
<div class="form-group mb-2"><%= f.select :from_day, options_for_select(@days.collect{ |day| day }), {}, {class: 'form-control'}%></div>
<h2 class="col-1 tilde">~</h2>
<div class="form-group mb-2"><%= f.select :to_year, options_for_select(@years.collect{ |year| year }), {prompt: 'None'},{class: 'form-control'}%></div>
<div class="form-group mb-2"><%= f.select :to_month, options_for_select(@months.collect{ |month| month }), {prompt: 'None'},{class: 'form-control'}%></div>
<div class="form-group mb-2"><%= f.select :to_day, options_for_select(@days.collect{ |day| day }), {prompt: 'None'},{class: 'form-control'}%></div>
</div>
<div class="border border-dark rounded">
<div class="job-details">
<div class="title">Job title:
<%= link_to job_detail_path(info_application.job.id) do %>
<strong><%= info_application.job.title %></strong>
<% end %>
</div>
<div class="name">Name:
<%= info_application.name %>
</div>
<div class="cv">CV:
<%= link_to info_application.cv_user.identifier, info_application.cv_user.url, download: info_application.cv_user.identifier %>
</div>
<div class="row">
<div class="col-6">Email:
<%= info_application.email %>
</div>
<div class="col-6 salary">Applied at: <%= info_application.updated_at.strftime('%d/%m/%Y') %></div>
</div>
</div>
</div>
<br>
<div class="row panigation">
<div class="col-12 d-flex justify-content-end paginate-jobs">
<%= paginate @user_apply_job, outer_window: 3, window: 2 %>
</div>
</div>
<div class="search-bar">
<%= form_for(:admin, url: admin_search_path) do |f| %>
<div class="search">
Email: <%= f.text_field :email, placeholder: 'Input Email...', class: 'form-control mr-sm-2' %>
</div>
<div class="city-options">
<div class="row">
<div class="col-2">City:</div>
<div class="form-group col-sm"><%= f.select :city_opt, options_for_select(@cities.collect{ |city| [ city.name, city.id] }), {prompt: 'All'}, {class: 'form-control'} %></div>
</div>
</div>
<div class="industry-options">
<div class="row">
<div class="col-2">Industry:</div>
<div class="form-group col-sm"><%= f.select :industry_opt, options_for_select(@industries.collect{ |industry| [ industry.name, industry.id] }), {prompt: 'All'}, {class: 'form-control'} %></div>
</div>
</div>
<div class="datetime">
<%= render "datetime", f: f %>
</div>
<div class="row">
<div class="col-3"></div>
<div class="search-btn col-3">
<%= f.submit 'Search', class: 'btn btn-primary' %>
</div>
<div class="download-csv-btn col-sm">
<% if @apply_job.count > 0 %>
<%= link_to('Download CSV', download_csv_path(format: :csv), class: 'btn btn-info')%>
<% else %>
<strong><i>Can't download CSV because can't find applications</i></strong>
<% end %>
</div>
</div>
<% end %>
</div>
<% provide(:title, 'Admin Page') %>
<div class="container">
<div><h1>Applied Jobs</h1></div>
<%= render "search_condition" %>
<div class="row total-apply-jobs">
<div class="col-4"><strong>Total: <%= @apply_job.count %> applications</strong></div>
</div>
<%= render "pagination" %>
<div class="apply-job-list">
<%= render partial: "information", collection: @user_apply_job, as: :info_application %>
</div>
<%= render "pagination" %>
</div>
<% provide(:title, "Admin Sign In") %>
<div class="container">
<%= render 'layouts/flash' %>
<h1 class="text-center login-label">Admin Login</h1>
<div class="form-login">
<div class="row form d-flex justify-content-center">
<%= form_for(:admin, url: admins_path) do |f| %>
<div class="email-field">
<div class="col-4-sm">
<%= f.label :email %>
</div>
<div class="col-8-sm">
<%= f.text_field :email %>
</div>
</div>
<div class="password-field">
<div class="col-4-sm">
<%= f.label :password %>
</div>
<div class="col-8-sm">
<%= f.password_field :password %>
</div>
</div>
<%= f.submit 'Login', class: 'btn btn-outline-primary btn-lg login-btn' %>
<% end %>
</div>
</div>
</div>
<% provide(:title, 'Search Page') %>
<div class="container">
<div><h1>Applied Jobs</h1></div>
<%= render "search_condition" %>
<div class="row total-apply-jobs">
<div class="col-4"><strong>Total: <%= @apply_job.count %> applications</strong></div>
</div>
<%= render "pagination" %>
<div class="apply-job-list">
<%= render partial: "information", collection: @user_apply_job, as: :info_application %>
</div>
<%= render "pagination" %>
</div>
......@@ -4,6 +4,9 @@
<%= link_to image_tag("logo_venjob.png", alt: "Logo", id: "logo_venjob", width: 120), root_path %>
<nav>
<ul class="navbar-nav mr-auto">
<% if signed_in? && current_user.admin? %>
<li><%= link_to "Log Out", admin_logout_path , class: "nav-item nav-link", method: "delete" %></li>
<% else %>
<% if signed_in? %>
<li><%= link_to "My Page", my_page_path , class: "nav-item nav-link" %></li>
<li><%= link_to "Log Out", logout_path , class: "nav-item nav-link", method: "delete" %></li>
......@@ -13,6 +16,7 @@
<% end %>
<li><%= link_to "Favorite", favorite_jobs_path, class: "nav-item nav-link" %></li>
<li><%= link_to "History", history_jobs_path, class: "nav-item nav-link" %></li>
<% end %>
</ul>
</nav>
</div>
......
......@@ -39,8 +39,16 @@ Rails.application.routes.draw do
get 'history', to: 'history_jobs#index', as: :history_jobs
get 'admin/login', to: 'admins#new', as: :admin_login
delete 'admin/logout', to: 'admins#destroy', as: :admin_logout
get 'admin/applies', to: 'admins#index', as: :admin_page
match 'admin/search', to: 'admins#search', via: [:get, :post], as: :admin_search
get 'download-csv', to: 'admins#download_csv', as: :download_csv
resources :history_jobs, only: [:index]
resources :favorite_jobs, only: [:create, :destroy, :index]
resources :admins, only: [:new, :create, :destroy, :index]
resources :applied_jobs, only: [:new, :create]
resources :reset_passwords, only: [:edit, :update]
resources :confirmations, only: [:new]
......
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