discerner 2.0.14 → 2.0.15
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/discerner/search_parameter.js +29 -13
- data/app/assets/javascripts/discerner/search_parameter_value.js +7 -3
- data/app/assets/stylesheets/discerner/searches.sass +3 -0
- data/app/views/discerner/searches/_search_parameter_value_fields.html.haml +8 -0
- data/lib/discerner/enum.rb +29 -0
- data/lib/discerner/methods/helpers/searches_helper.rb +1 -1
- data/lib/discerner/methods/models/parameter_type.rb +1 -1
- data/lib/discerner/methods/models/search_parameter.rb +3 -0
- data/lib/discerner/methods/models/search_parameter_value.rb +2 -2
- data/lib/discerner/version.rb +1 -1
- data/lib/generators/discerner/install/templates/dictionaries.yml +35 -25
- data/lib/setup/operators.yml +2 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49628dbdcf63e05933a54b84e4d6f0162c322f78
|
4
|
+
data.tar.gz: ca6cc17e8d4f66c9484508e195d7f6ddead236d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f8194a039eba254752279fe88b6aa848c7cd8085f88df29358b4ea6d5d9a9885825188560fa5af22829197826b404233707dfe90430af1022e6edd26af44bc0
|
7
|
+
data.tar.gz: e7306ba0e1dcc68816bf0b516440e20d8e843209c05f7182a8b9f8686e8c1e2a53609210bafe17077e7e22e74fa0c52de2227c4d5ea5b193d7794d79f3d28464
|
@@ -22,26 +22,26 @@ Discerner.SearchParameter.UI = function (config) {
|
|
22
22
|
}
|
23
23
|
});
|
24
24
|
$.each($('select.parameters_combobox_autocompleter option'), function(){
|
25
|
-
if (!($(this).hasClass(dictionary_class) || $(this).val()
|
25
|
+
if (!($(this).hasClass(dictionary_class) || $(this).val() === '')) {
|
26
26
|
$(this).remove();
|
27
27
|
}
|
28
28
|
});
|
29
|
-
}
|
29
|
+
}
|
30
30
|
$(".parameters_combobox_autocompleter").combobox({watermark:'a criteria'});
|
31
31
|
|
32
32
|
// get max display order
|
33
33
|
$.each(display_orders, function(){
|
34
|
-
var val = parseInt($(this).val());
|
35
|
-
if (val >= i) { i = val }
|
34
|
+
var val = parseInt($(this).val(), 10);
|
35
|
+
if (val >= i) { i = val; }
|
36
36
|
});
|
37
37
|
|
38
38
|
// assign display order to search predicates without it
|
39
39
|
$.each(display_orders, function(){
|
40
|
-
if ($(this).val().length
|
41
|
-
i = i + 1
|
40
|
+
if ($(this).val().length === 0) {
|
41
|
+
i = i + 1;
|
42
42
|
$(this).val(i);
|
43
43
|
}
|
44
|
-
})
|
44
|
+
});
|
45
45
|
},
|
46
46
|
searchParametersNestedAttributesForm = new NestedAttributes({
|
47
47
|
container: $('.search_parameters'),
|
@@ -57,7 +57,7 @@ Discerner.SearchParameter.UI = function (config) {
|
|
57
57
|
select = $(this).siblings('select').first(),
|
58
58
|
// get all the "sibling" dropdowns
|
59
59
|
sibling_selects = $('select.' + select.attr('class')).filter(function(){
|
60
|
-
return $(this).closest('tr').find('td.remove input[name$="[_destroy]"]:not([name*="[search_parameter_values_attributes]"])').filter(function() { return this.value === '1'; }).length
|
60
|
+
return $(this).closest('tr').find('td.remove input[name$="[_destroy]"]:not([name*="[search_parameter_values_attributes]"])').filter(function() { return this.value === '1'; }).length === 0; // exclude rows marked for destroy
|
61
61
|
}),
|
62
62
|
// get all selected parameter options from sibling selects
|
63
63
|
matching_selected_options = sibling_selects.find('option.exclusive:selected');
|
@@ -67,7 +67,7 @@ Discerner.SearchParameter.UI = function (config) {
|
|
67
67
|
$.each(matching_selected_options, function(){
|
68
68
|
option = select.find('option[value=' + $(this).val() + ']');
|
69
69
|
popup.find('.parameter_category .criteria a.categorized_autocompleter_item_link[rel="' + $(option).attr('id') + '"]').addClass('selection_disabled');
|
70
|
-
})
|
70
|
+
});
|
71
71
|
toggleCategorizedAutocompleterPopup(this);
|
72
72
|
toggleCategorizedAutocompleterPopup($(this).closest('.search_parameter').find('.parameter_value a.expanded_categorized_autocompleter_link'));
|
73
73
|
});
|
@@ -105,10 +105,9 @@ Discerner.SearchParameter.UI = function (config) {
|
|
105
105
|
add_button = $(predicate).find('a.add_search_parameter_values');
|
106
106
|
|
107
107
|
$(predicate).find('.nested_records_search_parameter_values .search_parameter_value .delete_search_parameter_values').click();
|
108
|
-
if ($(selected_option).length
|
108
|
+
if ($(selected_option).length === 0 || $(selected_option).val() === ''){
|
109
109
|
$(add_button).hide();
|
110
|
-
}
|
111
|
-
else if ($(selected_option).hasClass('list')){
|
110
|
+
} else if ($(selected_option).hasClass('list')) {
|
112
111
|
$($(predicate).find('.tmp_link')).remove();
|
113
112
|
$.get(parametersUrl.sub({ question_id: this.value }), function (data) {
|
114
113
|
$.each(data.parameter_values, function() {
|
@@ -119,12 +118,29 @@ Discerner.SearchParameter.UI = function (config) {
|
|
119
118
|
$(add_button).hide();
|
120
119
|
});
|
121
120
|
});
|
121
|
+
} else if ($(selected_option).hasClass('exclusive_list')) {
|
122
|
+
$($(predicate).find('.tmp_link')).remove();
|
123
|
+
$.get(parametersUrl.sub({ question_id: this.value }), function (data) {
|
124
|
+
$(add_button).click();
|
125
|
+
var row = $(predicate).find('.nested_records_search_parameter_values .search_parameter_value .parameter_value').filter(':last');
|
126
|
+
$.each(data.parameter_values, function() {
|
127
|
+
var value_id_element = row.find('.parameter_value_id'),
|
128
|
+
radio_id = value_id_element.attr('id') + '_' + this.parameter_value_id,
|
129
|
+
value_item_div = $('<div>').addClass('parameter_value_item');
|
130
|
+
|
131
|
+
radio_button = $('<input>').attr('type', 'radio').attr('name', value_id_element.attr('name')).attr('id',radio_id).val(this.parameter_value_id);
|
132
|
+
radio_button_text = $('<label>').attr('for', radio_id).text(this.name);
|
133
|
+
value_item_div.append(radio_button);
|
134
|
+
value_item_div.append(radio_button_text);
|
135
|
+
row.append(value_item_div);
|
136
|
+
$(add_button).hide();
|
137
|
+
});
|
138
|
+
});
|
122
139
|
} else {
|
123
140
|
$(add_button).show();
|
124
141
|
$(add_button).click();
|
125
142
|
}
|
126
143
|
});
|
127
|
-
|
128
144
|
setupParameters();
|
129
145
|
};
|
130
146
|
|
@@ -33,7 +33,7 @@ Discerner.SearchParameterValue.UI = function (config) {
|
|
33
33
|
hideValue($(row).find('.additional_value').show());
|
34
34
|
row.find('.parameter_values_boolean_operator').show();
|
35
35
|
|
36
|
-
if ($(selectedParameter).hasClass('list'))
|
36
|
+
if ($(selectedParameter).hasClass('list')){ // list parameters
|
37
37
|
row.find('.chosen, .parameter_value').show();
|
38
38
|
$(config.container).find('a.add_search_parameter_values').hide();
|
39
39
|
$(config.container).find('.additional_value').hide();
|
@@ -57,6 +57,10 @@ Discerner.SearchParameterValue.UI = function (config) {
|
|
57
57
|
}
|
58
58
|
$(config.container).find('.parameter_value, .remove').show();
|
59
59
|
$(config.container).find('a.add_search_parameter_values').show();
|
60
|
+
} else if ($(selectedParameter).hasClass('exclusive_list')) { // exclusive parameter values list
|
61
|
+
$(config.container).find('a.add_search_parameter_values').hide();
|
62
|
+
$(config.container).find('.additional_value', '.chosen').hide();
|
63
|
+
$(config.container).find('.parameter_value').show();
|
60
64
|
} else { // date, text and numeric parameters
|
61
65
|
var parameter_classes = ['date', 'numeric', 'text', 'string'];
|
62
66
|
for (var i in parameter_classes) {
|
@@ -164,7 +168,7 @@ Discerner.SearchParameterValue.UI = function (config) {
|
|
164
168
|
$(this).closest('.categorized-parameter-values, .uncategorized-parameter-values').find('.category-items').show();
|
165
169
|
$(this).addClass('hide-category-items');
|
166
170
|
$(this).removeClass('show-category-items');
|
167
|
-
$(this).html('less')
|
171
|
+
$(this).html('less');
|
168
172
|
});
|
169
173
|
|
170
174
|
$(document).on('click', '.hide-category-items', function(e) {
|
@@ -172,6 +176,6 @@ Discerner.SearchParameterValue.UI = function (config) {
|
|
172
176
|
$(this).closest('.categorized-parameter-values, .uncategorized-parameter-values').find('.category-items').hide();
|
173
177
|
$(this).addClass('show-category-items');
|
174
178
|
$(this).removeClass('hide-category-items');
|
175
|
-
$(this).html('more')
|
179
|
+
$(this).html('more');
|
176
180
|
});
|
177
181
|
};
|
@@ -47,6 +47,14 @@
|
|
47
47
|
%td.remove
|
48
48
|
= discerner_link_to_remove_fields 'Remove', f, :search_parameter_values
|
49
49
|
|
50
|
+
- when 'exclusive_list'
|
51
|
+
%td.parameter_value
|
52
|
+
- parameter.parameter_values.each do |parameter_value|
|
53
|
+
.parameter_value_item
|
54
|
+
= f.radio_button :parameter_value_id, parameter_value.id, class: 'parameter_value_id'
|
55
|
+
= f.label :parameter_value_id, parameter_value.name
|
56
|
+
%td{class: "remove", class: "invisible"}
|
57
|
+
= discerner_link_to_remove_fields 'Remove', f, :search_parameter_values
|
50
58
|
- else
|
51
59
|
%td.operator
|
52
60
|
- selected = f.object.operator.blank? ? nil : f.object.operator.id
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Discerner
|
2
|
+
module Enum
|
3
|
+
DISCERNER_PARAMETER_TYPE_NUMERIC = 'numeric'
|
4
|
+
DISCERNER_PARAMETER_TYPE_DATE = 'numeric'
|
5
|
+
DISCERNER_PARAMETER_TYPES = ['numeric', 'date', 'list', 'combobox', 'text', 'string', 'search', 'exclusive_list'].freeze
|
6
|
+
|
7
|
+
ABSTRACTION_OTHER_VALUE_TYPE_NOT_APPLICABLE = 'not applicable'
|
8
|
+
ABSTRACTION_OTHER_VALUE_TYPES = [ABSTRACTION_OTHER_VALUE_TYPE_UNKNOWN, ABSTRACTION_OTHER_VALUE_TYPE_NOT_APPLICABLE]
|
9
|
+
|
10
|
+
ABSTRACTION_STATUS_NEEDS_REVIEW = 'needs review'
|
11
|
+
ABSTRACTION_STATUS_REVIEWED = 'reviewed'
|
12
|
+
ABSTRACTION_STATUS_ACTUALLY_ANSWERED = 'actually answered'
|
13
|
+
ABSTRACTION_STATUSES = [ABSTRACTION_STATUS_NEEDS_REVIEW, ABSTRACTION_STATUS_REVIEWED, ABSTRACTION_STATUS_ACTUALLY_ANSWERED]
|
14
|
+
|
15
|
+
ABSTRACTION_SUGGESTION_TYPE_UNKNOWN = 'unknown'
|
16
|
+
ABSTRACTION_SUGGESTION_TYPE_SUGGESTED = 'suggested'
|
17
|
+
ABSTRACTION_SUGGESTION_TYPES = [ABSTRACTION_SUGGESTION_TYPE_UNKNOWN, ABSTRACTION_SUGGESTION_TYPE_SUGGESTED]
|
18
|
+
|
19
|
+
ABSTRACTOR_SECTION_TYPE_CUSTOM = 'custom'
|
20
|
+
ABSTRACTOR_SECTION_TYPE_NAME_VALUE = 'name/value'
|
21
|
+
ABSTRACTOR_SECTION_TYPES = [ABSTRACTOR_SECTION_TYPE_CUSTOM, ABSTRACTOR_SECTION_TYPE_NAME_VALUE]
|
22
|
+
|
23
|
+
ABSTRACTOR_SUGGESTION_STATUS_NEEDS_REVIEW = 'Needs review'
|
24
|
+
ABSTRACTOR_SUGGESTION_STATUS_ACCEPTED = 'Accepted'
|
25
|
+
ABSTRACTOR_SUGGESTION_STATUS_REJECTED = 'Rejected'
|
26
|
+
ABSTRACTOR_SUGGESTION_STATUSES = [ABSTRACTOR_SUGGESTION_STATUS_NEEDS_REVIEW, ABSTRACTOR_SUGGESTION_STATUS_ACCEPTED, ABSTRACTOR_SUGGESTION_STATUS_REJECTED]
|
27
|
+
ABSTRACTOR_GROUP_SENTINENTAL_SUBTYPE = 'sentinental'
|
28
|
+
end
|
29
|
+
end
|
@@ -90,7 +90,7 @@ module Discerner
|
|
90
90
|
parameter_categories_used = search.export_parameters.map{ |ep| ep.parameter.parameter_category }.flatten
|
91
91
|
parameter_categories = parameter_categories_available | parameter_categories_used
|
92
92
|
end
|
93
|
-
parameter_categories
|
93
|
+
parameter_categories
|
94
94
|
end
|
95
95
|
|
96
96
|
def exportable_parameters(search, category)
|
@@ -21,7 +21,7 @@ module Discerner
|
|
21
21
|
|
22
22
|
def name_supported?
|
23
23
|
return if self.name.blank?
|
24
|
-
supported_types = ['numeric', 'date', 'list', 'combobox', 'text', 'string', 'search']
|
24
|
+
supported_types = ['numeric', 'date', 'list', 'combobox', 'text', 'string', 'search', 'exclusive_list']
|
25
25
|
errors.add(:base,"Parameter type '#{self.name}' is not supported, please use one of the following types: #{supported_types.join(', ')}") unless supported_types.include?(self.name)
|
26
26
|
end
|
27
27
|
end
|
@@ -52,6 +52,9 @@ module Discerner
|
|
52
52
|
when 'combobox'
|
53
53
|
values = [search_parameter_values.map { |spv| spv.parameter_value.search_value unless spv.parameter_value.nil? }.compact]
|
54
54
|
predicate = "#{parameter.search_method} in (?)" unless values.blank?
|
55
|
+
when 'exclusive_list'
|
56
|
+
values = [search_parameter_values.map { |spv| spv.parameter_value.search_value unless spv.parameter_value.nil? }.compact.first]
|
57
|
+
predicate = "#{parameter.search_method} = ?" unless values.blank?
|
55
58
|
else # 'numeric','date', 'text', 'string
|
56
59
|
spvs = []
|
57
60
|
values = []
|
@@ -75,7 +75,7 @@ module Discerner
|
|
75
75
|
warnings.add(:base, "Provided date is not valid")
|
76
76
|
return true
|
77
77
|
end
|
78
|
-
if parameter_value.blank? && search_parameter.parameter.parameter_type.name
|
78
|
+
if parameter_value.blank? && ['combobox', 'exclusive_list'].include?(search_parameter.parameter.parameter_type.name)
|
79
79
|
warnings.add(:base, "Parameter value has to be selected")
|
80
80
|
return true
|
81
81
|
end
|
@@ -116,7 +116,7 @@ module Discerner
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def validate_operator
|
119
|
-
if search_parameter && search_parameter.parameter && search_parameter.parameter.parameter_type && ['list', 'combobox'].include?(search_parameter.parameter.parameter_type.name)
|
119
|
+
if search_parameter && search_parameter.parameter && search_parameter.parameter.parameter_type && ['list', 'combobox', 'exclusive_list'].include?(search_parameter.parameter.parameter_type.name)
|
120
120
|
self.operator = nil
|
121
121
|
else
|
122
122
|
errors.add(:base, "Operator has to be selected for parameter values that do not belong to list or combobox") if operator.blank?
|
data/lib/discerner/version.rb
CHANGED
@@ -1,36 +1,36 @@
|
|
1
1
|
# ---- General structure:
|
2
2
|
# :dictionaries:
|
3
|
-
# - :name: string
|
3
|
+
# - :name: string # has to be unique within not-deleted dictionaries
|
4
4
|
# :parameter_categories:
|
5
|
-
# - :name: string
|
5
|
+
# - :name: string # has to be unique within the dictionary
|
6
6
|
# :parameters:
|
7
|
-
# - :name: string
|
8
|
-
# :unique_identifier:
|
7
|
+
# - :name: string # used for display
|
8
|
+
# :unique_identifier: # has to be unique within the dictionary
|
9
9
|
# :export:
|
10
|
-
# :model: string
|
11
|
-
# :method: string
|
12
|
-
# :hidden: boolean
|
13
|
-
# :search:
|
14
|
-
# :model: string
|
15
|
-
# :method: string
|
16
|
-
# :hidden: boolean
|
17
|
-
# :parameter_type: numeric/date/list/combobox/text/string
|
18
|
-
# :parameter_value_categories_source:
|
19
|
-
# :model: string
|
20
|
-
# :method: string
|
21
|
-
# :parameter_value_categories:
|
10
|
+
# :model: string # name of the model to be used for exporting
|
11
|
+
# :method: string # name of the model method to be used for exporting
|
12
|
+
# :hidden: boolean # default: false. If set to true, parameter will be hidden from list of exportable parameters
|
13
|
+
# :search: # parameter search model and method combination has to be unique within the category
|
14
|
+
# :model: string # name of the model to be used for searching
|
15
|
+
# :method: string # name of the model method to be used for searching
|
16
|
+
# :hidden: boolean # default: false. If set to true, parameter will be hidden from list of searchable parameters
|
17
|
+
# :parameter_type: numeric/date/list/combobox/text/string/exclusive_list # used to define applicable operators/display options. does not have to be restricted to the given list, but additional parameters will require adding operators to match
|
18
|
+
# :parameter_value_categories_source: # used to define parameter value categories
|
19
|
+
# :model: string # source model to be used to load parameter value categiories
|
20
|
+
# :method: string # method in the source model that returns parameter_value_categories in a form of [{name: 'string, unique_identifier: 'adventure', display_order: 1, collapse: true}]
|
21
|
+
# :parameter_value_categories: # used to define parameter value categories
|
22
22
|
# - :name: string
|
23
|
-
# :unique_identifier: string
|
24
|
-
# :collapse: boolean
|
23
|
+
# :unique_identifier: string # has to be unique within parameter
|
24
|
+
# :collapse: boolean # used to define if parameter category should be collapsed in the list and its values hidden from the view
|
25
25
|
# :display_order: integer
|
26
|
-
# :allow_empty_values: boolean
|
27
|
-
# :parameter_values:
|
28
|
-
# - :name: string
|
29
|
-
# :search_value: string
|
30
|
-
# :parameter_value_category: string
|
26
|
+
# :allow_empty_values: boolean # default: true. If set to true, "none" value will be added to the list ov values
|
27
|
+
# :parameter_values: # needs to be defined for list/combobox parameters unless parameter values come from the model, see ':source'
|
28
|
+
# - :name: string # used for display, if not provided, 'search_value' will be used instead
|
29
|
+
# :search_value: string # has to be unique within parameter, intendend to be used as a database value while searching
|
30
|
+
# :parameter_value_category: string # used to define category for parameter value, should match one of parameter_value_categories unique_identifiers listed above
|
31
31
|
# :source:
|
32
|
-
# :model: string
|
33
|
-
# :method: string
|
32
|
+
# :model: string # source model to be used to load parameter values
|
33
|
+
# :method: string # method/method in the source model to be used to load parameter values
|
34
34
|
|
35
35
|
---
|
36
36
|
:dictionaries:
|
@@ -270,3 +270,13 @@
|
|
270
270
|
:method: text
|
271
271
|
:hidden: true
|
272
272
|
|
273
|
+
- :name: "Bestseller"
|
274
|
+
:unique_identifier: bestseller
|
275
|
+
:search:
|
276
|
+
:model: Book
|
277
|
+
:method: text
|
278
|
+
:parameter_type: exclusive_list
|
279
|
+
:parameter_values:
|
280
|
+
- :search_value: yes
|
281
|
+
- :search_value: no
|
282
|
+
|
data/lib/setup/operators.yml
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
- numeric
|
9
9
|
- date
|
10
10
|
- string
|
11
|
+
- exclusive_list
|
11
12
|
- :unique_identifier: is_not_equal_to
|
12
13
|
:type: comparison
|
13
14
|
:symbol: '!='
|
@@ -16,6 +17,7 @@
|
|
16
17
|
- numeric
|
17
18
|
- date
|
18
19
|
- string
|
20
|
+
- exclusive_list
|
19
21
|
- :unique_identifier: is_less_than
|
20
22
|
:type: comparison
|
21
23
|
:symbol: '<'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discerner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Gurley, Yulia Bushmanova
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -436,6 +436,7 @@ files:
|
|
436
436
|
- db/seeds.rb
|
437
437
|
- lib/discerner.rb
|
438
438
|
- lib/discerner/engine.rb
|
439
|
+
- lib/discerner/enum.rb
|
439
440
|
- lib/discerner/methods/controllers/export_parameters_controller.rb
|
440
441
|
- lib/discerner/methods/controllers/parameters_controller.rb
|
441
442
|
- lib/discerner/methods/controllers/searches_controller.rb
|