discerner 1.1.18

Sign up to get free protection for your applications and to get access to all the features.
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