mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-11 10:06:53 +08:00
241 lines
6.6 KiB
Ruby
241 lines
6.6 KiB
Ruby
class SearchController < ApplicationController
|
|
before_filter :load_vars, only: :index
|
|
before_filter :load_markdown, only: :index
|
|
|
|
MIN_QUERY_CHARS = 2
|
|
|
|
def index
|
|
if not @search_query
|
|
redirect_to new_search_path
|
|
end
|
|
|
|
count_search_results
|
|
|
|
search_projects if @search_category == :projects
|
|
search_experiments if @search_category == :experiments
|
|
search_workflows if @search_category == :workflows
|
|
search_modules if @search_category == :modules
|
|
search_results if @search_category == :results
|
|
search_tags if @search_category == :tags
|
|
search_reports if @search_category == :reports
|
|
search_protocols if @search_category == :protocols
|
|
search_steps if @search_category == :steps
|
|
search_checklists if @search_category == :checklists
|
|
search_samples if @search_category == :samples
|
|
search_assets if @search_category == :assets
|
|
search_tables if @search_category == :tables
|
|
search_comments if @search_category == :comments
|
|
|
|
@search_pages = (@search_count.to_f / SEARCH_LIMIT.to_f).ceil
|
|
@start_page = @search_page - 2
|
|
@start_page = 1 if @start_page < 1
|
|
@end_page = @start_page + 4
|
|
|
|
if @end_page > @search_pages
|
|
@end_page = @search_pages
|
|
@start_page = @end_page - 4
|
|
@start_page = 1 if @start_page < 1
|
|
end
|
|
end
|
|
|
|
def new
|
|
end
|
|
|
|
private
|
|
|
|
def load_vars
|
|
@search_query = params[:q] || ''
|
|
@search_category = params[:category] || ''
|
|
@search_category = @search_category.to_sym
|
|
@search_page = params[:page].to_i || 1
|
|
@display_query = @search_query
|
|
|
|
if @search_query.length < MIN_QUERY_CHARS
|
|
flash[:error] = t'search.index.error.query_length', n: MIN_QUERY_CHARS
|
|
return redirect_to :back
|
|
end
|
|
|
|
# splits the search query to validate all entries
|
|
@splited_query = @search_query.split
|
|
|
|
if @splited_query.first.length < MIN_QUERY_CHARS
|
|
flash[:error] = t'search.index.error.query_length', n: MIN_QUERY_CHARS
|
|
redirect_to :back
|
|
elsif @splited_query.length > 1
|
|
@search_query = ''
|
|
@splited_query.each_with_index do |w, i|
|
|
@search_query += "#{@splited_query[i]} " if w.length >= MIN_QUERY_CHARS
|
|
end
|
|
else
|
|
@search_query = @splited_query.join(' ')
|
|
end
|
|
|
|
@search_page = 1 if @search_page < 1
|
|
end
|
|
|
|
# Initialize markdown parser
|
|
def load_markdown
|
|
if @search_category == :results
|
|
@markdown = Redcarpet::Markdown.new(
|
|
Redcarpet::Render::HTML.new(
|
|
filter_html: true,
|
|
no_images: true
|
|
)
|
|
)
|
|
end
|
|
end
|
|
|
|
protected
|
|
|
|
def search_by_name(model)
|
|
model.search(current_user, true, @search_query, @search_page)
|
|
end
|
|
|
|
def count_by_name(model)
|
|
search_by_name(model).limit(nil).offset(nil).size
|
|
end
|
|
|
|
def count_search_results
|
|
@project_search_count = count_by_name Project
|
|
@experiment_search_count = count_by_name Experiment
|
|
@workflow_search_count = count_by_name MyModuleGroup
|
|
@module_search_count = count_by_name MyModule
|
|
@result_search_count = count_by_name Result
|
|
@tag_search_count = count_by_name Tag
|
|
@report_search_count = count_by_name Report
|
|
@protocol_search_count = count_by_name Protocol
|
|
@step_search_count = count_by_name Step
|
|
@checklist_search_count = count_by_name Checklist
|
|
@sample_search_count = count_by_name Sample
|
|
@asset_search_count = count_by_name Asset
|
|
@table_search_count = count_by_name Table
|
|
@comment_search_count = count_by_name Comment
|
|
|
|
@search_results_count = @project_search_count
|
|
@search_results_count += @experiment_search_count
|
|
@search_results_count += @workflow_search_count
|
|
@search_results_count += @module_search_count
|
|
@search_results_count += @result_search_count
|
|
@search_results_count += @tag_search_count
|
|
@search_results_count += @report_search_count
|
|
@search_results_count += @protocol_search_count
|
|
@search_results_count += @step_search_count
|
|
@search_results_count += @checklist_search_count
|
|
@search_results_count += @sample_search_count
|
|
@search_results_count += @asset_search_count
|
|
@search_results_count += @table_search_count
|
|
@search_results_count += @comment_search_count
|
|
end
|
|
|
|
def search_projects
|
|
@project_results = []
|
|
if @project_search_count > 0
|
|
@project_results = search_by_name Project
|
|
end
|
|
@search_count = @project_search_count
|
|
end
|
|
|
|
def search_experiments
|
|
@experiment_results = []
|
|
if @experiment_search_count > 0
|
|
@experiment_results = search_by_name Experiment
|
|
end
|
|
@search_count = @experiment_search_count
|
|
end
|
|
|
|
def search_workflows
|
|
@workflow_results = []
|
|
if @workflow_search_count > 0
|
|
@workflow_results = search_by_name MyModuleGroup
|
|
end
|
|
@search_count = @workflow_search_count
|
|
end
|
|
|
|
def search_modules
|
|
@module_results = []
|
|
if @module_search_count > 0
|
|
@module_results = search_by_name MyModule
|
|
end
|
|
@search_count = @module_search_count
|
|
end
|
|
|
|
def search_results
|
|
@result_results = []
|
|
if @result_search_count > 0
|
|
@result_results = search_by_name Result
|
|
end
|
|
@search_count = @result_search_count
|
|
end
|
|
|
|
def search_tags
|
|
@tag_results = []
|
|
if @tag_search_count > 0
|
|
@tag_results = search_by_name Tag
|
|
end
|
|
@search_count = @tag_search_count
|
|
end
|
|
|
|
def search_reports
|
|
@report_results = []
|
|
if @report_search_count > 0
|
|
@report_results = search_by_name Report
|
|
end
|
|
@search_count = @report_search_count
|
|
end
|
|
|
|
def search_protocols
|
|
@protocol_results = []
|
|
if @protocol_search_count > 0
|
|
@protocol_results = search_by_name Protocol
|
|
end
|
|
@search_count = @protocol_search_count
|
|
end
|
|
|
|
def search_steps
|
|
@step_results = []
|
|
if @step_search_count > 0
|
|
@step_results = search_by_name Step
|
|
end
|
|
@search_count = @step_search_count
|
|
end
|
|
|
|
def search_checklists
|
|
@checklist_results = []
|
|
if @checklist_search_count > 0
|
|
@checklist_results = search_by_name Checklist
|
|
end
|
|
@search_count = @checklist_search_count
|
|
end
|
|
|
|
def search_samples
|
|
@sample_results = []
|
|
if @sample_search_count > 0
|
|
@sample_results = search_by_name Sample
|
|
end
|
|
@search_count = @sample_search_count
|
|
end
|
|
|
|
def search_assets
|
|
@asset_results = []
|
|
if @asset_search_count > 0
|
|
@asset_results = search_by_name Asset
|
|
end
|
|
@search_count = @asset_search_count
|
|
end
|
|
|
|
def search_tables
|
|
@table_results = []
|
|
if @table_search_count > 0
|
|
@table_results = search_by_name Table
|
|
end
|
|
@search_count = @table_search_count
|
|
end
|
|
|
|
def search_comments
|
|
@comment_results = []
|
|
if @comment_search_count > 0
|
|
@comment_results = search_by_name Comment
|
|
end
|
|
@search_count = @comment_search_count
|
|
end
|
|
end
|