created admin page

parent d3fd0a39
Pipeline #1098 failed with stages
in 0 seconds
......@@ -25,9 +25,9 @@
font-size: 16px;
}
.tilde {
margin: 0 0 0 40px;
color: black;
}
.datetime {
margin: 20px;
padding: 10px;
.city-options, .industry-options, .datetime{
margin: 20px 0 20px 0;
}
class AdminsController < ApplicationController
before_action :sign_out_current_user
before_action :sign_in_validation_admin, only: [:index, :destroy]
before_action :remove_session, only:[:index]
before_action :sign_in_validation_admin, only: [:index, :destroy, :search]
def index
@cities = City.all
@industries = Industry.all
@count_apply_job = JobApplied.count
@user_apply_job = JobApplied.all.order(updated_at: :desc).page(params[:page]).per(Job::LIMIT_PAGE)
@apply_job = JobApplied.includes(job: :cities).includes(job: :industries)
@days = ['None']
@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 = ['None']
@months = []
(Admin::FIRST_MONTH..Admin::LAST_MONTH).each {|m| @months << m}
@years = ['None']
@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
......@@ -37,15 +87,12 @@ class AdminsController < ApplicationController
redirect_to root_path
end
def download_csv
@user_apply_job = JobApplied.all.order(updated_at: :desc)
respond_to do |format|
format.csv { send_data @user_apply_job.to_csv, filename: "test-#{Date.today}.csv"}
end
end
private
def remove_session
reset_session
end
def sign_out_current_user
sign_out if signed_in? && current_user.admin.nil?
end
......
......@@ -6,5 +6,5 @@ class Admin < ApplicationRecord
LAST_MONTH = 12
FIRST_YEAR = 2015
LAST_YEAR = 2020
LAST_YEAR = Time.current.year
end
require 'csv'
class JobApplied < ApplicationRecord
before_save { self.email = email.downcase }
mount_uploader :cv_user, UserCvUploader
......@@ -6,22 +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
def self.to_csv
attributes = %w{title name cv_user email updated_at}
CSV.generate(headers: true) do |csv|
csv << attributes
all.each do |info_application|
info_applied = info_application.attributes.values_at(*attributes)
info_applied[0] = info_application.job.title
csv << info_applied
end
end
end
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 justify-content-lg-center">
<div class="text col-1">Date:</div>
<select class="form-control col-1">
<%= @years.each do |year| %>
<option><%= year %></option>
<% end %>
</select>
<select class="form-control col-1">
<%= @months.each do |month| %>
<option><%= month %></option>
<% end %>
</select>
<select class="form-control col-1">
<%= @days.each do |day| %>
<option><%= day %></option>
<% end %>
</select>
<h2 class="col-1 tilde">~</h2>
<select class="form-control col-1">
<%= @years.each do |year| %>
<option><%= year %></option>
<% end %>
</select>
<select class="form-control col-1">
<%= @months.each do |month| %>
<option><%= month %></option>
<% end %>
</select>
<select class="form-control col-1">
<%= @days.each do |day| %>
<option><%= day %></option>
<% end %>
</select>
<div class="row">
<div class="text col-2">Date:</div>
<div class="col-1"><%= f.select :from_year, options_for_select(@years.collect{ |year| year }) %></div>
<div class="col-1"><%= f.select :from_month, options_for_select(@months.collect{ |month| month })%></div>
<div class="col-1"><%= f.select :from_day, options_for_select(@days.collect{ |day| day })%></div>
<h4 class="col-1 tilde">~</h4>
<div class="col-1"><%= f.select :to_year, options_for_select(@years.collect{ |year| year }), include_blank: 'None'%></div>
<div class="col-1"><%= f.select :to_month, options_for_select(@months.collect{ |month| month }), include_blank: 'None'%></div>
<div class="col-1"><%= f.select :to_day, options_for_select(@days.collect{ |day| day }), include_blank: 'None'%></div>
</div>
<div class="border border-dark rounded">
<div class="job-details">
<div class="title">Job title:
<%= link_to job_detail_path(info_application.id) do %>
<%= link_to job_detail_path(info_application.job.id) do %>
<strong><%= info_application.job.title %></strong>
<% end %>
</div>
......
<div class="search-bar">
<%= form_for(:admin, url: admin_search_path) do |f| %>
<div class="search">
Email: <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
Email: <%= f.text_field :email, placeholder: 'Input Email...', class: 'form-control mr-sm-2' %>
</div>
<div class="city-options">
City:
<select class="form-control" id="exampleFormControlSelect1">
<option>All</option>
<%= @cities.each do |city| %>
<option><%= city.name %></option>
<% end %>
</select>
<div class="row">
<div class="col-2">City:</div>
<div class="col-6"><%= f.select :city_opt, options_for_select(@cities.collect{ |city| [ city.name, city.id] }), include_blank: 'All'%></div>
</div>
</div>
<div class="industry-options">
Industry:
<select class="form-control" id="exampleFormControlSelect1">
<option>All</option>
<%= @industries.each do |industry| %>
<option><%= industry.name %></option>
<% end %>
</select>
<div class="row">
<div class="col-2">Industry:</div>
<div class="col-6"><%= f.select :industry_opt, options_for_select(@industries.collect{ |industry| [ industry.name, industry.id] }), include_blank: 'All' %></div>
</div>
</div>
<div class="datetime">
<%= render "datetime" %>
<%= render "datetime", f: f %>
</div>
<div class="row">
<div class="col-3"></div>
<div class="search-btn col-4">
<button class="btn btn-primary" type="submit">Search</button>
<%= f.submit 'Search', class: 'btn btn-primary' %>
</div>
<div class="download-csv-btn col-4">
<% 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>
......@@ -3,7 +3,7 @@
<div><h1>Applied Jobs</h1></div>
<%= render "search_condition" %>
<div class="row total-apply-jobs">
<div class="col-4"><strong>Total: <%= @count_apply_job %> applications</strong></div>
<div class="col-4"><strong>Total: <%= @apply_job.count %> applications</strong></div>
</div>
<%= render "pagination" %>
<div class="apply-job-list">
......
<% 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>
......@@ -37,6 +37,8 @@ Rails.application.routes.draw do
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 :applied_jobs, only: [:new, :create]
......
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