Skip to content

Commit

Permalink
Merge pull request #1126 from sparc-request/saw-bootstrap-cm-search
Browse files Browse the repository at this point in the history
SAW - Catalog Manager Search Functionality
  • Loading branch information
SamWord committed Sep 22, 2017
2 parents e0db1b0 + cb9e0d0 commit f3aebdd
Show file tree
Hide file tree
Showing 34 changed files with 758 additions and 400 deletions.
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

0 comments on commit f3aebdd

Please sign in to comment.