discerner 1.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +97 -0
  4. data/Rakefile +29 -0
  5. data/app/assets/images/discerner/add.png +0 -0
  6. data/app/assets/images/discerner/ajax-loader.gif +0 -0
  7. data/app/assets/images/discerner/bar.gif +0 -0
  8. data/app/assets/images/discerner/bullet_arrow_down.png +0 -0
  9. data/app/assets/images/discerner/bullet_arrow_up.png +0 -0
  10. data/app/assets/images/discerner/cog.png +0 -0
  11. data/app/assets/images/discerner/delete.png +0 -0
  12. data/app/assets/images/discerner/edit.png +0 -0
  13. data/app/assets/images/discerner/excel.png +0 -0
  14. data/app/assets/images/discerner/greencheck.gif +0 -0
  15. data/app/assets/images/discerner/rails.png +0 -0
  16. data/app/assets/images/discerner/show.png +0 -0
  17. data/app/assets/images/discerner/switch_minus.gif +0 -0
  18. data/app/assets/images/discerner/switch_plus.gif +0 -0
  19. data/app/assets/javascripts/discerner/application.js +20 -0
  20. data/app/assets/javascripts/discerner/combobox.js +301 -0
  21. data/app/assets/javascripts/discerner/discerner.js +19 -0
  22. data/app/assets/javascripts/discerner/export_parameters.js +13 -0
  23. data/app/assets/javascripts/discerner/jquery/jquery.blockUI.js +576 -0
  24. data/app/assets/javascripts/discerner/jquery/jquery.form.js +1074 -0
  25. data/app/assets/javascripts/discerner/nested_attributes.js +69 -0
  26. data/app/assets/javascripts/discerner/search_combinations.js +49 -0
  27. data/app/assets/javascripts/discerner/search_parameter.js +131 -0
  28. data/app/assets/javascripts/discerner/search_parameter_value.js +172 -0
  29. data/app/assets/javascripts/discerner/searches.js +93 -0
  30. data/app/assets/javascripts/discerner/url.js +42 -0
  31. data/app/assets/stylesheets/discerner/application.css +16 -0
  32. data/app/assets/stylesheets/discerner/buttons.sass +13 -0
  33. data/app/assets/stylesheets/discerner/categorized_autocompleter.sass +53 -0
  34. data/app/assets/stylesheets/discerner/discerner.sass +51 -0
  35. data/app/assets/stylesheets/discerner/export_parameters.sass +43 -0
  36. data/app/assets/stylesheets/discerner/links.sass +29 -0
  37. data/app/assets/stylesheets/discerner/searches.sass +205 -0
  38. data/app/assets/stylesheets/discerner/tables.sass +32 -0
  39. data/app/controllers/discerner/application_controller.rb +2 -0
  40. data/app/controllers/discerner/export_parameters_controller.rb +5 -0
  41. data/app/controllers/discerner/parameters_controller.rb +5 -0
  42. data/app/controllers/discerner/searches_controller.rb +5 -0
  43. data/app/helpers/discerner/application_helper.rb +4 -0
  44. data/app/helpers/discerner/parameters_helper.rb +5 -0
  45. data/app/helpers/discerner/searches_helper.rb +5 -0
  46. data/app/models/discerner/dictionary.rb +5 -0
  47. data/app/models/discerner/export_parameter.rb +5 -0
  48. data/app/models/discerner/operator.rb +5 -0
  49. data/app/models/discerner/parameter.rb +5 -0
  50. data/app/models/discerner/parameter_category.rb +5 -0
  51. data/app/models/discerner/parameter_type.rb +5 -0
  52. data/app/models/discerner/parameter_value.rb +5 -0
  53. data/app/models/discerner/parameter_value_categorization.rb +5 -0
  54. data/app/models/discerner/parameter_value_category.rb +5 -0
  55. data/app/models/discerner/search.rb +5 -0
  56. data/app/models/discerner/search_combination.rb +5 -0
  57. data/app/models/discerner/search_parameter.rb +5 -0
  58. data/app/models/discerner/search_parameter_value.rb +5 -0
  59. data/app/views/discerner/export_parameters/index.html.haml +55 -0
  60. data/app/views/discerner/parameters/_values_autocompleter.html.haml +49 -0
  61. data/app/views/discerner/parameters/values.html.haml +1 -0
  62. data/app/views/discerner/searches/_form.html.haml +21 -0
  63. data/app/views/discerner/searches/_form_combined_searches.html.haml +32 -0
  64. data/app/views/discerner/searches/_form_controls.html.haml +8 -0
  65. data/app/views/discerner/searches/_form_header.html.haml +39 -0
  66. data/app/views/discerner/searches/_form_search_parameters.html.haml +28 -0
  67. data/app/views/discerner/searches/_list.html.haml +17 -0
  68. data/app/views/discerner/searches/_search_combination_fields.html.haml +22 -0
  69. data/app/views/discerner/searches/_search_parameter_fields.html.haml +48 -0
  70. data/app/views/discerner/searches/_search_parameter_value_fields.html.haml +62 -0
  71. data/app/views/discerner/searches/_summary.html.haml +25 -0
  72. data/app/views/discerner/searches/edit.html.haml +8 -0
  73. data/app/views/discerner/searches/index.html.haml +13 -0
  74. data/app/views/discerner/searches/index.js.haml +1 -0
  75. data/app/views/discerner/searches/new.html.haml +3 -0
  76. data/app/views/discerner/searches/rename.html.haml +6 -0
  77. data/app/views/discerner/searches/update.js.haml +7 -0
  78. data/app/views/discerner/shared/_categorized_autocompleter_items.html.haml +15 -0
  79. data/app/views/discerner/shared/_error_messages.html.haml +5 -0
  80. data/app/views/layouts/discerner/searches.html.erb +17 -0
  81. data/config/cucumber.yml +8 -0
  82. data/config/routes.rb +17 -0
  83. data/db/migrate/20121004040716_create_discerner_dictionaries.rb +11 -0
  84. data/db/migrate/20121004153043_create_discerner_parameter_categories.rb +12 -0
  85. data/db/migrate/20121005194843_create_discerner_parameter_types.rb +11 -0
  86. data/db/migrate/20121005203223_create_discerner_parameters.rb +14 -0
  87. data/db/migrate/20121008154855_create_discerner_operators.rb +13 -0
  88. data/db/migrate/20121008160313_create_discerner_operators_parameter_types.rb +8 -0
  89. data/db/migrate/20121008161455_create_discerner_parameter_values.rb +13 -0
  90. data/db/migrate/20121008180829_create_discerner_searches.rb +11 -0
  91. data/db/migrate/20121008182443_create_discerner_search_parameters.rb +11 -0
  92. data/db/migrate/20121011205130_create_discerner_search_parameter_values.rb +15 -0
  93. data/db/migrate/20121211213215_add_dictionary_id_to_discerner_searches.rb +5 -0
  94. data/db/migrate/20130205193602_create_discerner_search_combinations.rb +12 -0
  95. data/db/migrate/20130211230636_create_discerner_export_parameters.rb +9 -0
  96. data/db/migrate/20130213185818_add_search_columns_to_discerner_parameters.rb +38 -0
  97. data/db/migrate/20130213205255_rename_database_name_to_search_value_in_discerner_parameter_values.rb +5 -0
  98. data/db/migrate/20130215165416_add_searchable_to_discerner_parameters.rb +5 -0
  99. data/db/migrate/20130218230257_add_exclusive_to_discerner_parameters.rb +5 -0
  100. data/db/migrate/20130220163015_replace_integer_type_with_numeric.rb +22 -0
  101. data/db/migrate/20130221172826_add_unique_identifier_to_discerner_parameters.rb +5 -0
  102. data/db/migrate/20130222052924_change_search_attribute_to_method.rb +29 -0
  103. data/db/migrate/20130222070959_add_export_columns_to_discerner_parameters.rb +6 -0
  104. data/db/migrate/20130227031747_add_unique_identifier_to_discerner_operators.rb +16 -0
  105. data/db/migrate/20130306015019_change_discerner_parameter_values_name.rb +9 -0
  106. data/db/migrate/20130306212430_add_deleted_at_to_discerner_search_parameters.rb +5 -0
  107. data/db/migrate/20130306212504_add_deleted_at_to_discerner_search_parameter_values.rb +5 -0
  108. data/db/migrate/20130306212527_add_deleted_at_to_discerner_search_combinations.rb +5 -0
  109. data/db/migrate/20130306212818_add_deleted_at_to_discerner_export_parameters.rb +5 -0
  110. data/db/migrate/20130311190717_add_operator_type_to_discerner_operators.rb +5 -0
  111. data/db/migrate/20131212175110_remove_extra_search_parameter_values.rb +10 -0
  112. data/db/migrate/20140204170625_create_discerner_parameter_value_categories.rb +16 -0
  113. data/db/migrate/20140204170646_create_discerner_parameter_value_categorizations.rb +12 -0
  114. data/db/migrate/20140227191827_remove_blank_parameter_values_from_export_parameters.rb +10 -0
  115. data/db/seeds.rb +0 -0
  116. data/lib/discerner/engine.rb +16 -0
  117. data/lib/discerner/methods/controllers/export_parameters_controller.rb +38 -0
  118. data/lib/discerner/methods/controllers/parameters_controller.rb +30 -0
  119. data/lib/discerner/methods/controllers/searches_controller.rb +204 -0
  120. data/lib/discerner/methods/helpers/searches_helper.rb +145 -0
  121. data/lib/discerner/methods/models/dictionary.rb +54 -0
  122. data/lib/discerner/methods/models/export_parameter.rb +35 -0
  123. data/lib/discerner/methods/models/operator.rb +42 -0
  124. data/lib/discerner/methods/models/parameter.rb +90 -0
  125. data/lib/discerner/methods/models/parameter_category.rb +60 -0
  126. data/lib/discerner/methods/models/parameter_type.rb +33 -0
  127. data/lib/discerner/methods/models/parameter_value.rb +87 -0
  128. data/lib/discerner/methods/models/parameter_value_categorization.rb +21 -0
  129. data/lib/discerner/methods/models/parameter_value_category.rb +45 -0
  130. data/lib/discerner/methods/models/search.rb +147 -0
  131. data/lib/discerner/methods/models/search_combination.rb +50 -0
  132. data/lib/discerner/methods/models/search_parameter.rb +128 -0
  133. data/lib/discerner/methods/models/search_parameter_value.rb +130 -0
  134. data/lib/discerner/methods/models/soft_delete.rb +35 -0
  135. data/lib/discerner/methods/models/warning.rb +15 -0
  136. data/lib/discerner/parser.rb +497 -0
  137. data/lib/discerner/version.rb +3 -0
  138. data/lib/discerner.rb +4 -0
  139. data/lib/generators/discerner/dictionary/dictionary_generator.rb +38 -0
  140. data/lib/generators/discerner/dictionary/templates/model.rb +15 -0
  141. data/lib/generators/discerner/dictionary/templates/show.xls.erb +37 -0
  142. data/lib/generators/discerner/dictionary/templates/view.html.haml +2 -0
  143. data/lib/generators/discerner/install/install_generator.rb +153 -0
  144. data/lib/generators/discerner/install/templates/controllers/export_parameters_controller.rb +20 -0
  145. data/lib/generators/discerner/install/templates/controllers/parameters_controller.rb +15 -0
  146. data/lib/generators/discerner/install/templates/controllers/searches_controller.rb +39 -0
  147. data/lib/generators/discerner/install/templates/dictionaries.yml +236 -0
  148. data/lib/generators/discerner/install/templates/helpers/searches_helper.rb +9 -0
  149. data/lib/generators/discerner/install/templates/models/book.rb +15 -0
  150. data/lib/generators/discerner/install/templates/models/dictionary.rb +9 -0
  151. data/lib/generators/discerner/install/templates/models/export_parameter.rb +9 -0
  152. data/lib/generators/discerner/install/templates/models/operator.rb +9 -0
  153. data/lib/generators/discerner/install/templates/models/parameter.rb +10 -0
  154. data/lib/generators/discerner/install/templates/models/parameter_category.rb +9 -0
  155. data/lib/generators/discerner/install/templates/models/parameter_type.rb +9 -0
  156. data/lib/generators/discerner/install/templates/models/parameter_value.rb +9 -0
  157. data/lib/generators/discerner/install/templates/models/parameter_value_categorization.rb +9 -0
  158. data/lib/generators/discerner/install/templates/models/parameter_value_category.rb +9 -0
  159. data/lib/generators/discerner/install/templates/models/search.rb +9 -0
  160. data/lib/generators/discerner/install/templates/models/search_combination.rb +9 -0
  161. data/lib/generators/discerner/install/templates/models/search_parameter.rb +9 -0
  162. data/lib/generators/discerner/install/templates/models/search_parameter_value.rb +9 -0
  163. data/lib/generators/discerner/install/templates/views/layouts/searches.html.erb +17 -0
  164. data/lib/setup/operators.yml +91 -0
  165. data/lib/tasks/cucumber.rake +65 -0
  166. data/lib/tasks/discerner_tasks.rake +30 -0
  167. metadata +531 -0
@@ -0,0 +1,39 @@
1
+ #discerner_search_header
2
+ - if @discerner_search.persisted?
3
+ #messages
4
+
5
+ .discerner_search_dictionary
6
+ %b Dictionary:
7
+ %span{ :class => "#{@discerner_search.dictionary.css_class_name}"}
8
+ #{@discerner_search.dictionary.name}
9
+ - if @discerner_search.dictionary.deleted?
10
+ %span{ :style => "color:red;"}
11
+ %b This dictionary has been deleted. You will not be able to execute or edit this search.
12
+
13
+ .discerner_search_name
14
+ %b Search name:
15
+ %span.discerner_search_name
16
+ = @discerner_search.display_name
17
+ %span.discerner_search_name_edit
18
+ = link_to 'Edit', '#', :class => "edit_link icon_link"
19
+
20
+ - else
21
+ .discerner_dictionary_required_message
22
+ %span
23
+ Select dictionary in order to add search criteria
24
+
25
+ %div.discerner_search_dictionary
26
+ - if @searchable_dictionaries.length > 1
27
+ = f.label :dictionary_id
28
+ = f.select :dictionary_id, dictionary_options(@searchable_dictionaries), :include_blank => true
29
+ - else
30
+ %b Dictionary:
31
+ = f.hidden_field :dictionary_id, :value => @searchable_dictionaries.last.id
32
+ %span{ :class => "#{@searchable_dictionaries.last.css_class_name}"}
33
+ = @searchable_dictionaries.last.name
34
+
35
+ %div.discerner_search_name
36
+ = f.label :name, "Search name"
37
+ = f.text_field :name
38
+
39
+ .clear
@@ -0,0 +1,28 @@
1
+ %table{ :class => 'records search_parameters' }
2
+ %thead
3
+ %tr
4
+ %th.parameter_boolean_operator
5
+ %th.parameter
6
+ Criteria
7
+ %th.remove
8
+ %th.parameter_values
9
+ Selections
10
+ %tbody.nested_records_search_parameters
11
+ = f.fields_for :search_parameters, f.object.search_parameters.ordered_by_display_order do |search_parameter|
12
+ = render :partial => 'search_parameter_fields', :locals => { :f => search_parameter }
13
+ %tfoot
14
+ %tr
15
+ %td{ :colspan => '4', :class => 'add_search_parameters_link' }
16
+ = link_to_add_fields "Add criteria", :search_parameters
17
+ .clear
18
+
19
+ :javascript
20
+ $(function () {
21
+ var discernerSearchParametersTemplate = '#{generate_nested_attributes_template(f, :search_parameters, 'search_parameter')}',
22
+ parametersUrl = decodeURIComponent('#{values_parameters_url(:parameter_id => ':question_id', :format => 'json')}'); // used to generate parameter values for list parameters
23
+
24
+ new Discerner.SearchParameter.UI({
25
+ searchParametersTemplate: discernerSearchParametersTemplate,
26
+ parametersUrl: parametersUrl
27
+ });
28
+ });
@@ -0,0 +1,17 @@
1
+ %table{ :class => 'records' }
2
+ %thead
3
+ %tr
4
+ %th Name
5
+ %th Last updated on
6
+ %th
7
+ %tbody
8
+ - @discerner_searches.each do |search|
9
+ %tr{:class=>"#{cycle('odd_record','even_record')} #{'error' if search.disabled?}"}
10
+ %td
11
+ = search.display_name
12
+ %td
13
+ = format_datetime(search.updated_at)
14
+ %td
15
+ = link_to 'Open', edit_search_path(search), :class => 'show_link icon_link'
16
+ = link_to 'Export options', export_parameters_path(search), :class => 'options_link icon_link' if export_discerner_results?
17
+ = link_to 'Delete', search_path(search), :data => {:confirm => 'Are you sure?'}, :method => :delete, :class => "icon_link delete_link"
@@ -0,0 +1,22 @@
1
+ - if f.object.disabled? && f.object.warnings.any?
2
+ %tr.error
3
+ %td
4
+ %td.warnings{:colspan => "4"}
5
+ %span
6
+ = f.object.warnings.full_messages.join(', ')
7
+
8
+ - unless f.blank?
9
+ - search_combination_id = nested_record_id(f, :search_combination)
10
+ %tr{ :id => "#{search_combination_id}", :class => "search_combination fields #{'error' if f.object.warnings.any?}" }
11
+ %td.combined_search_operator
12
+ %span
13
+ restrict to
14
+ %td.combined_search
15
+ %div.combined_search_combobox
16
+ = f.hidden_field :display_order
17
+ = f.hidden_field :operator_id, :value => Discerner::Operator.where(:symbol => 'include').first.id
18
+ -#= f.select(:operator_id, operator_options('search'))
19
+ = f.select(:combined_search_id, combined_searches_options(@discerner_search), { :include_blank => true },{ :class => 'search_combinations_combobox_autocompleter' })
20
+ %td.remove
21
+ = link_to_remove_fields 'Remove', f, :search_combinations
22
+ %td
@@ -0,0 +1,48 @@
1
+ - search_parameter_id = nested_record_id(f, :search_parameter)
2
+
3
+ - if f.object.disabled? && f.object.warnings.any?
4
+ %tr.error
5
+ %td
6
+ %td.warnings{:colspan => "4"}
7
+ %span
8
+ = f.object.warnings.full_messages.join(', ')
9
+
10
+ %tr{ :id => "#{search_parameter_id}", :class => "search_parameter fields #{'error' if f.object.warnings.any?}" }
11
+ %td.parameter_boolean_operator
12
+ %span
13
+ where
14
+ %td.parameter
15
+ %div{:class => 'ui-widget categorized_autocompleter'}
16
+ = f.hidden_field :display_order
17
+ = f.select(:parameter_id, parameter_options(@searchable_parameters, search_parameter_id), { :include_blank => true },{ :class => 'parameters_combobox_autocompleter' })
18
+ %a{ :href => 'javascript:void(0);', :class => 'categorized_autocompleter_link collapsed_categorized_autocompleter_link' }
19
+ Select
20
+ .div-category-popup{ :style => "display: none;"}
21
+ .div-category-list
22
+ - @searchable_parameter_categories.each do |parameter_category|
23
+ = div_for parameter_category, :class => "#{parameter_category.dictionary.css_class_name}" do
24
+ %p{ :class => 'parameter_category_name' }
25
+ = parameter_category.name
26
+ - items = @searchable_parameters.select{|sp| sp.parameter_category_id == parameter_category.id}.sort{|a,b| a.name <=> b.name}.map{ |p| {:name => p.name, :rel => searchable_object_index(p, search_parameter_id)}}
27
+ - unless items.empty?
28
+ = render :partial => 'discerner/shared/categorized_autocompleter_items', :locals => { :columns_count => 4, :items => items }
29
+
30
+ .div-instruction-bar
31
+ %td.remove
32
+ = link_to_remove_fields 'Remove', f, :search_parameters
33
+ %td.parameter_values
34
+ .search_parameter_values
35
+ %table{ :class => 'records' }
36
+ %tbody.nested_records_search_parameter_values
37
+ = f.fields_for :search_parameter_values, f.object.search_parameter_values.ordered_by_display_order do |search_parameter_value_form|
38
+ = render :partial => 'search_parameter_value_fields', :locals => { :f => search_parameter_value_form }
39
+ %span{ :class => 'add_header'}
40
+ = link_to_add_fields "Add selection", :search_parameter_values, {:style => "display:none;"}
41
+
42
+ :javascript
43
+ $(function () {
44
+ var searchParameterValuesTemplate = '#{generate_nested_attributes_template(f, :search_parameter_values, "search_parameter_value")}',
45
+ container = $('##{search_parameter_id}'),
46
+ parametersUrl = decodeURIComponent('#{values_parameters_url(:parameter_id => ':question_id', :search_parameter_value_id => ':search_parameter_value_id')}'), // used to generate parameter values for combobox parameters
47
+ searchParameterUI = new Discerner.SearchParameterValue.UI({ container: container, searchParameterValuesTemplate: searchParameterValuesTemplate, parametersUrl: parametersUrl });
48
+ });
@@ -0,0 +1,62 @@
1
+ - search_parameter_value_id = nested_record_id(f, :search_parameter_value)
2
+ - if f.object.disabled? && f.object.warnings.any?
3
+ %tr.error
4
+ %td
5
+ %td.warnings{:colspan => "6"}
6
+ %span
7
+ = f.object.warnings.full_messages.join(', ')
8
+
9
+ %tr{ :id => "#{search_parameter_value_id}", :class => "search_parameter_value fields #{'error' if f.object.warnings.any?} search_parameter_value_new" }
10
+ %td.parameter_values_boolean_operator
11
+ = f.hidden_field :display_order
12
+ %span
13
+
14
+ - if f.object.new_record? # this part is used for rendering newly added parameter values
15
+ %td.operator
16
+ = f.select(:operator_id, operator_options, { :include_blank => true })
17
+ %td.chosen
18
+ = f.check_box :chosen
19
+ %td.parameter_value
20
+ = f.hidden_field :parameter_value_id, :class => 'parameter_value_id'
21
+ %span{ :class => 'parameter_value_text' }
22
+ %td.value
23
+ = f.text_field :value
24
+ %td.additional_value
25
+ = f.text_field :additional_value
26
+ %td.remove
27
+ = link_to_remove_fields 'Remove', f, :search_parameter_values
28
+
29
+ - else # this part is used for rendering existing parameter values
30
+ - parameter = f.object.search_parameter.parameter
31
+ - type = parameter.parameter_type.name
32
+
33
+ - case type
34
+ - when 'list'
35
+ %td.chosen
36
+ = f.check_box :chosen
37
+ %td.parameter_value
38
+ = f.hidden_field :parameter_value_id, :class => 'parameter_value_id'
39
+ %span{ :class => 'parameter_value_text' }
40
+ = f.object.parameter_value.name
41
+ %td{:class => "remove", :class => "invisible"}
42
+ = link_to_remove_fields 'Remove', f, :search_parameter_values
43
+
44
+ - when 'combobox'
45
+ %td.parameter_value
46
+ = render :partial => 'discerner/parameters/values_autocompleter', :locals => {:parameter => parameter, :f => f, :search_parameter_value_id => search_parameter_value_id}
47
+ %td.remove
48
+ = link_to_remove_fields 'Remove', f, :search_parameter_values
49
+
50
+ - else
51
+ %td.operator
52
+ - selected = f.object.operator.blank? ? nil : f.object.operator.id
53
+ = f.select(:operator_id, options_for_select([["", ""]] + operator_options(type), selected))
54
+
55
+ %td{:class => "value #{'invisible' if f.object.operator && f.object.operator.operator_type == 'presence'}"}
56
+ = f.text_field :value, :class => "#{type == 'date' ? 'datepicker' : nil}"
57
+
58
+ %td{:class => "additional_value #{'invisible' unless f.object.operator && f.object.operator.operator_type == 'range'}"}
59
+ = f.text_field :additional_value, :class => "#{type == 'date' ? 'datepicker' : nil}"
60
+ %td.remove
61
+ = link_to_remove_fields 'Remove', f, :search_parameter_values
62
+
@@ -0,0 +1,25 @@
1
+ #discerner_search_summary
2
+ %h3 Selected criteria
3
+ %table
4
+ - if @discerner_search.combined_searches.any?
5
+ %tr.discerner_combined_searches_summary
6
+ %td.parameter_category
7
+ %b Included searches:
8
+ %td.search_parameter_summary
9
+ = @discerner_search.combined_searches.map{|cs| cs.name}.join(', ')
10
+
11
+ - @discerner_search.parameter_categories.each do |category|
12
+ - search_parameters = @discerner_search.search_parameters
13
+ - search_parameters = search_parameters.by_parameter_category(category) if category
14
+ - unless search_parameters.blank?
15
+ %tr.parameter_category
16
+ %th{:colspan => "2"}
17
+ = category.name
18
+ - search_parameters.each do |sp|
19
+ %tr.search_parameter_summary
20
+ %td.parameter_name
21
+ #{sp.parameter.name}:
22
+ %td.parameter_value
23
+ = search_parameter_values(sp)
24
+ .clear
25
+
@@ -0,0 +1,8 @@
1
+ #discerner_search
2
+ %br
3
+ = render 'form'
4
+
5
+ - if show_discerner_results?
6
+ #discerner_results
7
+ = render :partial => discerner_results_partial
8
+ .clear
@@ -0,0 +1,13 @@
1
+ #discerner_searches
2
+ %p
3
+ %h3 Saved searches
4
+
5
+ #filter
6
+ = form_tag searches_path, :id => 'discerner_searches_filter', :class => "filter", :method => 'get', :remote => true do
7
+ %div.filter
8
+ = label_tag :query, "Filter by name"
9
+ = text_field_tag :query, params[:query]
10
+ #searches-list
11
+ = render :partial => "list"
12
+ .discerner-buttons
13
+ = link_to 'Start a new search', new_search_path, { :class => 'discerner-button discerner-button-positive' }
@@ -0,0 +1 @@
1
+ $("#searches-list").html("#{escape_javascript(render :partial => 'list')}")
@@ -0,0 +1,3 @@
1
+ #discerner_search
2
+ %br
3
+ = render 'form'
@@ -0,0 +1,6 @@
1
+ = form_tag search_path(@discerner_search), :method => :put, :remote => :true do
2
+ = render 'discerner/shared/error_messages', :object => @discerner_search
3
+ = text_field_tag "search[name]", @discerner_search.name.strip
4
+
5
+ = submit_tag 'Submit', :class => 'discerner-button discerner-button-positive'
6
+ = link_to 'Cancel', edit_search_path(@discerner_search), :class => 'discerner-button discerner-button-negative cancel'
@@ -0,0 +1,7 @@
1
+ - if @discerner_search.errors.any?
2
+ $("#messages").html("#{escape_javascript(render :partial => 'shared/error_messages', :locals => {:object => @discerner_search})}")
3
+ - else
4
+ $("#messages").html('')
5
+ $('span.discerner_search_name_edit_dialog').siblings('span.discerner_search_name').html("#{@discerner_search.display_name}").show();
6
+ $('span.discerner_search_name_edit_dialog').siblings('span.discerner_search_name_edit').show();
7
+ $('span.discerner_search_name_edit_dialog').remove();
@@ -0,0 +1,15 @@
1
+ - columns_count ||= 4
2
+ - unless items.blank?
3
+ - items_rendered_count = 0
4
+ - (0...columns_count).each do |i|
5
+ .column
6
+ %ul
7
+ - column_items_count = ((items.size - items_rendered_count).to_f/(columns_count-i)).ceil
8
+ - from = items_rendered_count
9
+ - to = items_rendered_count + column_items_count
10
+ - to = items.size if to > items.size
11
+ - items_rendered_count = to
12
+ - (from...to).each do |j|
13
+ .criteria
14
+ %li
15
+ = link_to items[j][:name], 'javascript:void(0);', :class => 'categorized_autocompleter_item_link', :rel => "#{items[j][:rel]}"
@@ -0,0 +1,5 @@
1
+ - if object.errors.any?
2
+ %div{ :id => "error", :class => "message"}
3
+ - object.errors.full_messages.each do |msg|
4
+ = msg
5
+ %br
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <%= yield :title %>
5
+ <%= stylesheet_link_tag "discerner/application", :media => "all" %>
6
+ <%= javascript_include_tag "discerner/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body class="discerner">
10
+ <% flash.each do |message_type, message| %>
11
+ <div class="message" id="<%= message_type %>">
12
+ <%= message %>
13
+ </div>
14
+ <% end %>
15
+ <%= yield %>
16
+ </body>
17
+ </html>
@@ -0,0 +1,8 @@
1
+ <%
2
+ rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
+ rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
5
+ %>
6
+ default: <%= std_opts %> features
7
+ wip: --tags @wip:3 --wip features
8
+ rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
data/config/routes.rb ADDED
@@ -0,0 +1,17 @@
1
+ Discerner::Engine.routes.draw do
2
+ resources :searches do
3
+ member do
4
+ get :rename
5
+ resources :export_parameters, :only => :index do
6
+ collection do
7
+ post :assign
8
+ end
9
+ end
10
+ end
11
+ end
12
+ resources :parameters do
13
+ collection do
14
+ get :values
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ class CreateDiscernerDictionaries < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_dictionaries do |t|
4
+ t.string :name, :null => false
5
+ t.datetime :deleted_at
6
+
7
+ t.timestamps
8
+ end
9
+ add_index :discerner_dictionaries, [:name, :deleted_at], :unique => true, :name => 'index_discerner_dictionaries'
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ class CreateDiscernerParameterCategories < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_parameter_categories do |t|
4
+ t.integer :dictionary_id, :null => false
5
+ t.string :name, :null => false
6
+ t.datetime :deleted_at
7
+
8
+ t.timestamps
9
+ end
10
+ add_index :discerner_parameter_categories, [:name, :dictionary_id, :deleted_at], :unique => true, :name => 'index_discerner_parameter_categories'
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class CreateDiscernerParameterTypes < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_parameter_types do |t|
4
+ t.string :name
5
+ t.datetime :deleted_at
6
+
7
+ t.timestamps
8
+ end
9
+ add_index :discerner_parameter_types, [:name, :deleted_at], :unique => true, :name => 'index_discerner_parameter_types'
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ class CreateDiscernerParameters < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_parameters do |t|
4
+ t.string :name
5
+ t.datetime :deleted_at
6
+ t.integer :parameter_category_id
7
+ t.integer :parameter_type_id
8
+ t.string :database_name
9
+
10
+ t.timestamps
11
+ end
12
+ add_index :discerner_parameters, [:database_name, :deleted_at], :unique => true, :name => 'index_discerner_parameters'
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ class CreateDiscernerOperators < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_operators do |t|
4
+ t.string :symbol
5
+ t.string :text
6
+ t.boolean :binary
7
+ t.datetime :deleted_at
8
+
9
+ t.timestamps
10
+ end
11
+ add_index :discerner_operators, [:symbol, :deleted_at], :unique => true, :name => 'index_discerner_operators'
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ class CreateDiscernerOperatorsParameterTypes < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_operators_parameter_types do |t|
4
+ t.belongs_to :operator
5
+ t.belongs_to :parameter_type
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ class CreateDiscernerParameterValues < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_parameter_values do |t|
4
+ t.string :name
5
+ t.string :database_name
6
+ t.datetime :deleted_at
7
+ t.integer :parameter_id
8
+
9
+ t.timestamps
10
+ end
11
+ add_index :discerner_parameter_values, [:database_name, :parameter_id, :deleted_at], :unique => true, :name => 'index_discerner_parameter_values'
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ class CreateDiscernerSearches < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_searches do |t|
4
+ t.string :name
5
+ t.string :username
6
+ t.datetime :deleted_at
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class CreateDiscernerSearchParameters < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_search_parameters do |t|
4
+ t.integer :search_id
5
+ t.integer :parameter_id
6
+ t.integer :display_order
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ class CreateDiscernerSearchParameterValues < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_search_parameter_values do |t|
4
+ t.integer :parameter_value_id
5
+ t.integer :operator_id
6
+ t.integer :search_parameter_id
7
+ t.string :value
8
+ t.string :additional_value
9
+ t.boolean :chosen
10
+ t.integer :display_order
11
+
12
+ t.timestamps
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class AddDictionaryIdToDiscernerSearches < ActiveRecord::Migration
2
+ def change
3
+ add_column :discerner_searches, :dictionary_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ class CreateDiscernerSearchCombinations < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_search_combinations do |t|
4
+ t.integer :search_id
5
+ t.integer :combined_search_id
6
+ t.integer :operator_id
7
+ t.integer :display_order
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ class CreateDiscernerExportParameters < ActiveRecord::Migration
2
+ def change
3
+ create_table :discerner_export_parameters do |t|
4
+ t.integer :search_id
5
+ t.integer :parameter_id
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ class AddSearchColumnsToDiscernerParameters < ActiveRecord::Migration
2
+ class ParameterCategory < ActiveRecord::Base
3
+ include Discerner::Methods::Models::ParameterCategory
4
+ end
5
+
6
+ class Parameter < ActiveRecord::Base
7
+ include Discerner::Methods::Models::Parameter
8
+ end
9
+
10
+ def self.up
11
+ add_column :discerner_parameters, :search_model, :string
12
+ add_column :discerner_parameters, :search_attribute, :string
13
+
14
+ Discerner::Parameter.order(:id).each do |p|
15
+ p.search_attribute = p.database_name
16
+ p.search_model = p.parameter_category.parameterized_name
17
+ p.save!
18
+ end
19
+
20
+ remove_index :discerner_parameters, :name => 'index_discerner_parameters'
21
+ remove_column :discerner_parameters, :database_name
22
+ add_index :discerner_parameters, [:search_model, :search_attribute, :parameter_category_id, :deleted_at], :unique => true, :name => 'index_discerner_parameters'
23
+ end
24
+
25
+ def self.down
26
+ add_column :discerner_parameters, :database_name, :string
27
+
28
+ Discerner::Parameter.order(:id).each do |p|
29
+ p.database_name = p.search_attribute
30
+ p.save!
31
+ end
32
+
33
+ remove_index :discerner_parameters, :name => 'index_discerner_parameters'
34
+ remove_column :discerner_parameters, :search_model
35
+ remove_column :discerner_parameters, :search_attribute
36
+ add_index :discerner_parameters, [:database_name, :deleted_at], :unique => true, :name => 'index_discerner_parameters'
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ class RenameDatabaseNameToSearchValueInDiscernerParameterValues < ActiveRecord::Migration
2
+ def change
3
+ rename_column :discerner_parameter_values, :database_name, :search_value
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddSearchableToDiscernerParameters < ActiveRecord::Migration
2
+ def change
3
+ add_column :discerner_parameters, :searchable, :boolean
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddExclusiveToDiscernerParameters < ActiveRecord::Migration
2
+ def change
3
+ add_column :discerner_parameters, :exclusive, :boolean
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ # This migration comes from discerner (originally 20130220163015)
2
+ class ReplaceIntegerTypeWithNumeric < ActiveRecord::Migration
3
+ class ParameterType < ActiveRecord::Base
4
+ include Discerner::Methods::Models::ParameterCategory
5
+ end
6
+
7
+ def up
8
+ parameter_type = Discerner::ParameterType.find_by_name('integer')
9
+ unless parameter_type.blank?
10
+ parameter_type.name = 'numeric'
11
+ parameter_type.save!
12
+ end
13
+ end
14
+
15
+ def down
16
+ parameter_type = Discerner::ParameterType.find_by_name('numeric')
17
+ unless parameter_type.blank?
18
+ parameter_type.name = 'integer'
19
+ parameter_type.save!
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ class AddUniqueIdentifierToDiscernerParameters < ActiveRecord::Migration
2
+ def change
3
+ add_column :discerner_parameters, :unique_identifier, :string
4
+ end
5
+ end