Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SAW - Catalog Manager Search Functionality #1126

Merged
merged 12 commits into from
Sep 22, 2017
1 change: 1 addition & 0 deletions app/assets/javascripts/catalog_manager/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
//= require form_manager
//= require form_fx_manager
//= require twitter/typeahead.min
//= require handlebars-v4.0.5
//= require assert
//= require ajax_handler
//= require sweetalert.min
51 changes: 49 additions & 2 deletions app/assets/javascripts/catalog_manager/catalog.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,66 @@
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

$ ->
initialize_org_search()

$('.collapse').on('show.bs.collapse', (e) ->
$(e.target).prev('.panel-heading').find('.glyphicon-folder-close').removeClass('glyphicon-folder-close').addClass('glyphicon-folder-open')
).on('hide.bs.collapse', (e) ->
$(e.target).prev('.panel-heading').find('.glyphicon-folder-open').removeClass('glyphicon-folder-open').addClass('glyphicon-folder-close')
)

$(document).on 'click','.availability-button', ->
$(document).on 'click','#clear-search-button', ->
$('.search-result').removeClass('search-result')
$('.panel-collapse.in').collapse('hide');

$(document).on 'click','#availability-button', ->
show_available_only = $(this).data('show-available-only')
$.ajax
method: "GET"
url: "/catalog_manager.js?show_available_only=#{show_available_only}"

success: ->
initialize_org_search()

##############################################
### ORGANIZATION/SERVICE SEARCH BLOODHOUND ###
##############################################

initialize_org_search = () ->
services_bloodhound = new Bloodhound(
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote:
url: "/search/organizations?term=%QUERY&show_available_only=#{$('#availability-button').data('show-available-only')}",
wildcard: '%QUERY'
)
services_bloodhound.initialize() # Initialize the Bloodhound suggestion engine
$('#organization-query').typeahead(
{
minLength: 3,
hint: false,
},
{
displayKey: 'term',
source: services_bloodhound,
limit: 100,
templates: {
suggestion: Handlebars.compile('<button class="text-left">
<strong><span class="{{text_color}}">{{type}}</span><span>: {{name}}</span></strong><span class="text-danger"> {{inactive_tag}}</span><br>
<span>Abbreviation: {{abbreviation}}</span><br>
<span>{{cpt_code}}</span>
</button>')
notFound: '<div class="tt-suggestion">No Results</div>'
}
}
).on('typeahead:select', (event, suggestion) ->
for parent in suggestion['parents']
target = $(parent).data('target')
$(target).collapse('show')
form_link = $(suggestion['value_selector']).parent()
form_link.parent().addClass("search-result")
form_link.siblings().find(".org-form-label").click()
)




Expand Down
8 changes: 8 additions & 0 deletions app/assets/stylesheets/catalog_manager/catalog.sass
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ $institution-service-blue: #0078AE
$provider-green: #339933
$program-orange: #ff9933
$core-blue: #003366
$result-highlight: #ffff99


/* Styling */
Expand Down Expand Up @@ -58,6 +59,13 @@ $core-blue: #003366
.text-core
color: $core-blue !important

.search-result
background: $result-highlight
background: -webkit-linear-gradient(left, $result-highlight, white)
background: -o-linear-gradient(right, $result-highlight, white)
background: -moz-linear-gradient(right, $result-highlight, white)
background: linear-gradient(to right, $result-highlight , white)

#catalog, #org-form-container
margin-top: 25px

Expand Down
5 changes: 4 additions & 1 deletion app/assets/stylesheets/catalog_manager/layout.sass
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,7 @@

.no-padding-y
padding-top: 0px !important
padding-bottom: 0px !important
padding-bottom: 0px !important

.twitter-typeahead
display: block !important
2 changes: 1 addition & 1 deletion app/assets/stylesheets/twitter_typeahead.sass
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
.tt-suggestion:hover
background-color: #EEE

.catalog-center
.catalog-center, #search-header
.tt-suggestion
font-size: 12px
.tt-menu
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/catalog_manager/cores_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def create
super
end

def show
def edit
@path = catalog_manager_core_path
super
end
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/catalog_manager/institutions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def create
@user.catalog_manager_rights.create( organization_id: @organization.id )
end

def show
def edit
@path = catalog_manager_institution_path
super
end
Expand Down
11 changes: 8 additions & 3 deletions app/controllers/catalog_manager/organizations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,22 @@
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class CatalogManager::OrganizationsController < CatalogManager::AppController
layout false
respond_to :js, :html, :json

def create
@organization.build_subsidy_map() unless @organization.type == 'Institution'
@organization.save
end

def show
def edit
@organization = Organization.find(params[:id])
@organization.setup_available_statuses
render 'catalog_manager/organizations/show'

respond_to do |format|
format.js
end

#TODO: Validate user can edit organization
render 'catalog_manager/organizations/edit'
end

def update
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/catalog_manager/programs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def create
super
end

def show
def edit
@path = catalog_manager_program_path
super
end
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/catalog_manager/providers_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def create
super
end

def show
def edit
@path = catalog_manager_provider_path
super
end
Expand Down
9 changes: 7 additions & 2 deletions app/controllers/catalog_manager/services_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,17 @@

class CatalogManager::ServicesController < CatalogManager::AppController
layout false
respond_to :js, :html, :json
respond_to :html, :json, except: :edit

def show
def edit
@service = Service.find params[:id]
@programs = @service.provider.programs
@cores = @service.program.cores

#TODO: Validate user can edit service
respond_to do |format|
format.js
end
end

def update_cores
Expand Down
39 changes: 37 additions & 2 deletions app/controllers/search_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

class SearchController < ApplicationController
before_action :initialize_service_request
before_action :authorize_identity
before_action :initialize_service_request, only: [:services]
before_action :authorize_identity, only: [:services]

def services
term = params[:term].strip
Expand Down Expand Up @@ -56,4 +56,39 @@ def services

render json: results.to_json
end

def organizations
term = params[:term].strip
if params[:show_available_only] == 'false' #the param name is the opposite of what is currently displayed
query_available = " AND is_available = 1"
end

results = Organization.where("(name LIKE ? OR abbreviation LIKE ?)#{query_available}", "%#{term}%", "%#{term}%") +
Service.where("(name LIKE ? OR abbreviation LIKE ? OR cpt_code LIKE ?)#{query_available}", "%#{term}%", "%#{term}%", "%#{term}%")

results.map! { |org|
{
name: org.name,
abbreviation: org.abbreviation,
type: org.class.to_s,
text_color: "text-#{org.class.to_s.downcase}",
cpt_code: cpt_code_text(org),
inactive_tag: inactive_text(org),
parents: org.parents.reverse.map{ |p| "##{p.class.to_s.downcase}-#{p.id}" },
value_selector: "##{org.class.to_s.downcase}-#{org.id}"
}
}

render json: results.to_json
end

private

def cpt_code_text(org)
text = org.class == Service ? "CPT code: #{org.cpt_code}" : ""
end

def inactive_text(org)
text = org.is_available ? "" : "(Inactive)"
end
end
2 changes: 1 addition & 1 deletion app/lib/dashboard/service_calendars.rb
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ def self.generate_visit_navigation(arm, service_request, pages, tab, portal=nil,
# Organization B, which belongs to Organization C, return "C > B > A".
# This "hierarchy" stops at a process_ssrs Organization.
def self.display_organization_hierarchy(line_item)
parent_organizations = line_item.service.parents.reverse
parent_organizations = line_item.service.parents
root = parent_organizations.find_index { |org| org.process_ssrs? } || (parent_organizations.length - 1)
parent_organizations[0..root].map(&:abbreviation).reverse.join(' > ')
end
Expand Down
4 changes: 2 additions & 2 deletions app/models/arm.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def service_list
last_parent = nil
last_parent_name = nil
found_parent = false
service.parents.reverse.each do |parent|
service.parents.each do |parent|
next if !parent.process_ssrs? && !found_parent
found_parent = true
last_parent = last_parent || parent.id
Expand All @@ -134,7 +134,7 @@ def service_list
acks << parent.ack_language unless parent.ack_language.blank?
end
if found_parent == false
service.parents.reverse.each do |parent|
service.parents.each do |parent|
name << parent.abbreviation
acks << parent.ack_language unless parent.ack_language.blank?
end
Expand Down
12 changes: 6 additions & 6 deletions app/models/service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,10 @@ def process_ssrs_organization
organization.process_ssrs_parent
end

# Return the parent organizations of the service. Note that this
# returns the organizations in the reverse order of
# Organization#parents.
def parents
return organization.parents.reverse + [ organization ]
# Return the parent organizations of the service.
def parents id_only=false
parent_org = id_only ? organization.id : organization
return [ parent_org ] + organization.parents(id_only)
end

def core
Expand Down Expand Up @@ -112,7 +111,8 @@ def institution
def available_surveys
available = nil

parents.each do |parent|
#TODO: Should we get all parent surveys instead of the closest parent's surveys?
parents.reverse.each do |parent|
next if parent.type == 'Institution' # Institutions can't define associated surveys
available = parent.associated_surveys.map(&:survey) unless parent.associated_surveys.empty?
end
Expand Down
4 changes: 2 additions & 2 deletions app/models/service_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ def service_list(is_one_time_fee=nil, service_provider=nil, admin_ssr=nil)
last_parent = nil
last_parent_name = nil
found_parent = false
service.parents.reverse.each do |parent|
service.parents.each do |parent|
next if !parent.process_ssrs? && !found_parent
found_parent = true
last_parent = last_parent || parent.id
Expand All @@ -280,7 +280,7 @@ def service_list(is_one_time_fee=nil, service_provider=nil, admin_ssr=nil)
acks << parent.ack_language unless parent.ack_language.blank?
end
if found_parent == false
service.parents.reverse.each do |parent|
service.parents.each do |parent|
name << parent.abbreviation
acks << parent.ack_language unless parent.ack_language.blank?
end
Expand Down
24 changes: 12 additions & 12 deletions app/views/catalog_manager/catalog/_accordion.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
- institutions.where(is_available: show_available_only).each do |institution|
.panel-heading.no-padding-y
.col-sm-1.no-padding-y
= link_to folder_glyphicon(), 'javascript:void(0)', data: { id: institution.id, toggle: 'collapse', target: ".institution-#{institution.id}", parent: '#cm-accordion' }
= link_to folder_glyphicon(), 'javascript:void(0)', id: "institution-#{institution.id}", data: { toggle: 'collapse', target: ".institution-#{institution.id}", parent: '#cm-accordion' }
.col-sm-11.no-padding-y
= link_to accordion_link_text(institution), 'javascript:void(0)', class: 'org-form-label panel-title'
= link_to accordion_link_text(institution), edit_catalog_manager_institution_path(institution), class: 'org-form-label panel-title', remote: true
.panel-collapse.collapse{ class: "institution-#{institution.id}" }
.panel-body.no-padding-y
.panel-heading.no-padding-y
Expand All @@ -41,9 +41,9 @@
- institution.providers.where(is_available: show_available_only).order("`order`").each do |provider|
.panel-heading.no-padding-y
.col-sm-1.no-padding-y
= link_to folder_glyphicon(), 'javascript:void(0)', data: { id: provider.id, toggle: 'collapse', target: ".provider-#{provider.id}", parent: "#institution-#{institution.id}" }
= link_to folder_glyphicon(), 'javascript:void(0)', id: "provider-#{provider.id}", data: { toggle: 'collapse', target: ".provider-#{provider.id}", parent: "#institution-#{institution.id}" }
.col-sm-11.no-padding-y
= link_to accordion_link_text(provider), 'javascript:void(0)', class: 'org-form-label panel-title'
= link_to accordion_link_text(provider), edit_catalog_manager_provider_path(provider), class: 'org-form-label panel-title', remote: true
.panel-collapse.collapse{ class: "provider-#{provider.id}" }
.panel-body.no-padding-y
.panel-heading.no-padding-y
Expand All @@ -54,9 +54,9 @@
- provider.programs.where(is_available: show_available_only).order("`order`").each do |program|
.panel-heading.no-padding-y
.col-sm-1.no-padding-y
= link_to folder_glyphicon(), 'javascript:void(0)', data: { id: program.id, toggle: 'collapse', target: ".program-#{program.id}", parent: "provider-#{provider.id}" }
= link_to folder_glyphicon(), 'javascript:void(0)', id: "program-#{program.id}", data: { toggle: 'collapse', target: ".program-#{program.id}", parent: "provider-#{provider.id}" }
.col-sm-11.no-padding-y
= link_to accordion_link_text(program), 'javascript:void(0)', class: 'org-form-label panel-title'
= link_to accordion_link_text(program), edit_catalog_manager_program_path(program), class: 'org-form-label panel-title', remote: true
.panel-collapse.collapse{ class: "program-#{program.id}" }
.panel-body.no-padding-y
.panel-heading.no-padding-y
Expand All @@ -72,9 +72,9 @@
- program.cores.where(is_available: show_available_only).order("`order`").each do |core|
.panel-heading.no-padding-y
.col-sm-1.no-padding-y
= link_to folder_glyphicon(), 'javascript:void(0)', data: { id: core.id, toggle: 'collapse', target: ".core-#{core.id}", parent: "program-#{program.id}" }
= link_to folder_glyphicon(), 'javascript:void(0)', id: "core-#{core.id}", data: { toggle: 'collapse', target: ".core-#{core.id}", parent: "program-#{program.id}" }
.col-sm-11.no-padding-y
= link_to accordion_link_text(core), 'javascript:void(0)', class: 'org-form-label panel-title'
= link_to accordion_link_text(core), edit_catalog_manager_core_path(core), class: 'org-form-label panel-title', remote: true
.panel-collapse.collapse{ class: "core-#{core.id}" }
.panel-body.no-padding-y
.panel-heading.no-padding-y
Expand All @@ -85,12 +85,12 @@
- core.services.where(is_available: show_available_only).order("`order`, `name`").each do |service|
.panel-heading.no-padding-y
.col-sm-1.no-padding-y
= link_to file_glyphicon(), 'javascript:void(0)', data: { id: service.id, parent: "core-#{core.id}" }
= link_to file_glyphicon(), 'javascript:void(0)', id: "service-#{service.id}", data: { parent: "core-#{core.id}" }
.col-sm-11.no-padding-y
= link_to accordion_link_text(service), 'javascript:void(0)', class: 'org-form-label panel-title'
= link_to accordion_link_text(service), edit_catalog_manager_service_path(service), class: 'org-form-label panel-title', remote: true
- program.services.where(is_available: show_available_only).order("`order`, `name`").each do |service|
.panel-heading.no-padding-y
.col-sm-1.no-padding-y
= link_to file_glyphicon(), 'javascript:void(0)', data: { id: service.id, parent: "program-#{program.id}" }
= link_to file_glyphicon(), 'javascript:void(0)', id: "service-#{service.id}", data: { parent: "program-#{program.id}" }
.col-sm-11.no-padding-y
= link_to accordion_link_text(service), 'javascript:void(0)', class: 'org-form-label panel-title'
= link_to accordion_link_text(service), edit_catalog_manager_service_path(service), class: 'org-form-label panel-title', remote: true